我的回答
栈比较小, 堆比较大
栈先进后出, 对是连续存放
垃圾回收
栈分为2个空间, 新生代和老生代
没有用到的, 会被清除, 然后进行整理, 与另外个空间进行交换, 长久存在的会放到堆中
堆是标记清除, 清除完后进行排序
参考回答
一、栈和堆的区别
栈:其操作系统自动分配释放,存放函数的参数值和局部变量的值等。其操作方式类似于数据结构中的栈。简单的理解就是当定义一个变量的时候,计算机会在内存中开辟一块存储空间来存放这个变量的值,这块空间叫做栈,然而栈中一般存放的是基本数据类型,栈的特点就是先进后出(或者后进先出)
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。其实在堆中一般存放变量的是一些对象类型
- 1.存储大小
栈内存的存储大小是固定的,申请时由系统自动分配内存空间,运行的效率比较快,但是因为存储的大小固定,所以容易存储的大小超过存储的大小,导致溢栈。
堆内存的存储的值是大小不定,是由程序员自己申请并指明大小。因为堆内存是new分配的内存,所以运行的效率会比较低
- 2.存储对象
栈内存存储的是基础数据类型,并且是按值访问的,因为栈是一块连续的内存区域,以后进先出的原则存储调用的,所以是连续存储的
堆内存是向高地址扩展的数据结构,是不连续的内存区域,系统也是用链表来存储空闲的内存地址,所以是不连续的。因为是记录的内存地址,所以获取是通过引用,存储的是对象居多
- 3.回收
栈的回收是系统控制实现的
堆内存的回收是人为控制的,当程序结束后,系统会自动回收
二、垃圾回收栈和堆的区别
栈内存中的数据只要结束,则直接回收
堆内存中的对象回收标准是否可达,在V8中对象先分配到新生代的From中,如果不可达直接释放,如果可达,就复制到TO中,然后将TO和From互换。当多次复制后依然没有回收,则放入老生代中,进行标记回收。之后将内存碎片进行整合放到一端。