垃圾回收涉及的面试题
非常言简意赅、易于理解且有一定深度
垃圾回收算法:
- 标记空间中的可达值
- 回收不可达的值所占据的内存
- 做内存整理
什么时候垃圾回收
浏览器将对象分为两类:临时对象、长久对象
V8又把堆分为两部分:新生代、老生代,分别对应浏览器的副垃圾回收器、主垃圾回收器
垃圾回收时会阻塞Javascript运行,造成页面卡顿,所以对于垃圾回收有以下几种收集方式:
- 分代收集
- 增量收集
- 闲时收集
主垃圾回收器
负责老生代的垃圾回收,有两个特点:
- 对象占用空间大
- 对象存活时间长
使用【标记-清除】算法执行垃圾回收
可以进行碎片整理
副垃圾回收器
负责新生代的垃圾回收,通常只支持1~8M的容量
新生代分两个区域:From区 ( 对象区 ) 、To(空闲区)
当空闲区对象占用空间超过25%,直接晋升老生代;当对象多次复制后(两次垃圾回收)还是存在,移动到老生代(即对象晋升策略)
副垃圾回收器没有碎片整理,因为标记后存活的对象会被拷贝到空闲区,此时已经是有序的了
同时,这里面还提到一点,闭包实际上并不会造成内存泄漏,闭包里的变量就是需要用到的变量,而内存泄漏指的是不需要用到的变量仍然占据内存。之所以会造成这样的误解,是因为之前IE有bug,即使在使用完闭包也依然不会回收比闭包引用的变量。