一、标记清除
1、原理
从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)
标记后 (黑色:可回收 | 灰色:存活对象 | 白色:未使用 )
清除后
2、适用场景
-
存活对象较多的情况下比较高效
-
适用于年老代(即旧生代)
3、实现过程
-
标记阶段
-
标记阶段从root开始递归地给堆里所有被引用对象打上标记。标记算法一般是用深度或者广度搜索,深度搜索可以压缩内存使用量,所以一般用深度
-
-
清除阶段
-
collector也会遍历整个堆,然后回收释放所有没有打标的内存对象
-
清除阶段,通过变量 sweeping 遍历堆,具体来说就是从堆首地址 $heap_start 开始,按顺序一个个遍历对象的标志位
-
遍历回收过程中,我们用free_list空闲链表来链接所有被回收的空闲内存块
-
4、优化过程
-
multi-si