fe-interview
fe-interview copied to clipboard
聊聊浏览器的垃圾回收机制?
JavaScript的数据是如何回收的?
- 栈中的垃圾数据如何回收? JavaScript 引擎会通过向下移动 ESP 来销毁该函数保存在栈中的执行上下文。
ESP 是记录当前执行状态的指针
- 堆中的垃圾数据如何回收?
要回收堆中的垃圾数据,就需要用到 JavaScript 中的垃圾回收器。
代际假说,两个特点:
- 第一个是大部分对象在内存中存在的位置很短,简单来说,就是很多对象一经分配内存,很快就变得不可访问;
- 第二个是不死的对象,会获得很久
v8会把堆分为新生代和老生代两个区域,新生代中存放的是生存时间短的对象,老生代中存放的是生存时间久的对象。他们分别采用不同的垃圾回收机器。
- 副垃圾回收器,主要负责新生代的垃圾回收
- 主垃圾回收器,主要负责老生代的垃圾回收
不论是什么类型的垃圾回收器,它们都有一个套共同的执行流程。
第一步:标记空间中活动对象和非活动对象,所谓活动对象就是还在使用的对象,非活动对象就是可以进行垃圾回收的对象。
第二步:回收非活动对象所占据的内存。其实就是在所有的标记完成之后,统一清理内存中所有被标记为可回收的对象。
第三步:做内存整理。一般来说,频繁回收对象后,内存中就存在大量不连续的空间。形成了很多内存碎片。当出现大量的内存碎片,就会出现需要较大连续内存的时候,内存不足。所以需要整理内存碎片(副垃圾回收器不会产生内存碎片)。
新生代垃圾回收器 - 副垃圾回收器 新生区划分为对象区域和空闲区域 对象晋升策略,经过两次垃圾回收依然还存活的对象,会被移动到老生区中。
老生代垃圾回收器 - 主垃圾回收器 采用标记 - 清楚的算法进行来及回收。 对象占用空间大,对象存活时间长 对于内存碎片,标记 - 整理 ,当所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。