垃圾收集底层算法实现
三色标记
在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。所以标记的时候分为三种颜色,黑色,白色,灰色
黑色:表示对象已经被垃圾收集器访问过,并且它的所有引用也都扫描过,是安全存活的对象,如果有其他对象引用了黑色,那么无需重新扫描改对象
灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过
白色:表示对象尚未被垃圾收集器访问过。所以,最开始的时候,所有的对象都是白色,如果扫描一遍以后,还是白色,那么表示这个对象不可达,垃圾收集器
记忆集与卡表
在新生代扫描时,可能会引用到老年代的对象,产生跨代引用,如果再去老年代扫描,效率太低了。
所以在新生代可以引入记录集(RememberSet)的数据结构(记录从非收集区到收集区的指针集合),避免把整个老年代加入GCRoots扫描范围。事实上并不只是新生代、老年代之间才有跨代引用的问题,所有涉及部分区域收集(PartialGC)行为的垃圾收集器,典型的如G1、ZGC和Shenandoah收集器,
垃圾收集底层算法实现最先出现在Python成神之路。
共有 0 条评论