-
什么是垃圾
-
对象不再被引用
-
对象无法从根上访问到
-
-
常见的 GC 算法
-
引用计数
-
标记清除
-
标记整理
-
分代回收
-
-
引用计数
-
原理
-
设置引用数,判断引用数是否为 0
-
引用关系改变时修改引用数
-
当引用数为 0 立即回收
-
-
优点
-
发现垃圾立即回收
-
最大限度减少程序暂停
-
-
缺点
-
无法回收循环引用对象
-
时间开销大
-
-
-
标记清除
-
原理
-
分为标记和清除两个阶段
-
标记:遍历所有对象,标记所有活动对象
-
清除:清除没有标记的对象
-
回收空间
-
-
优点
- 可以回收循环引用对象
-
缺点
-
内存空间碎片化
-
-
-
标记整理
-
原理
-
与标记清除类似
-
在清除之前先整理内存空间,移动对象位置
-
-
优点
- 减少碎片化空间
-
缺点
-
不会立即回收垃圾对象
-
移动对象位置,回收效率慢
-
-
-
V8 垃圾回收
-
原理
- 采用分代回收,新生代与老生代的回收算法不同
-
新生代回收过程
-
复制算法 + 标记整理
-
新生代内存分为两个等大小空间
-
使用空间为 from, 空闲空间为 to
-
活动对象存储到 from
-
标记整理后将活动对象从 form copy 到 to
-
from 与 to 交换空间
-
-
细节
-
copy 过程可能出现晋升
-
晋升 === 新生代移动到老生代
-
晋升条件 === 一轮 GG 还存活的新生代 or to 空间使用率超过 25%
-
-
老生代回收
-
采用标记清除, 标记整理, 增量标记
-
使用标记清除完成垃圾空间的回收
-
采用标记整理进行空间优化
-
采用增量标记进行效率优化
-
-
-
增量标记是什么
程序执行和垃圾回收是两个不同过程,并且垃圾回收会阻塞程序执行,使用增量标记,将一次垃圾回收分为几次,这样不会阻塞程序执行