深度揭秘垃圾回收底层,这次让你彻底弄懂它
The following article is from yes的练级攻略 Author 是Yes呀
Java 与 C++ 之间有一堵由内存动态分配和垃圾收集技术所围成的高墙 ---《深入理解Java虚拟机》
正文
如何判断对象已成垃圾?
引用计数
那像 CPython 是如何解决循环引用的问题呢?
对每个容器对象,将 gc_refs 设置为该对象的引用计数。
对每个容器对象,查找它所引用的容器对象,并减少找到的被引用的容器对象的 gc_refs 字段。
将此时 gc_refs 大于 0 的容器对象移动到不同的集合中,因为 gc_refs 大于 0 说明有对象外部引用它,因此不能释放这些对象。
然后找出 gc_refs 大于 0 的容器对象所引用的对象,它们也不能被清除。
最后剩下的对象说明仅由该链表中的对象引用,没有外部引用,所以是垃圾可以清除。
可达性分析
1、保守式 GC
2、半保守式GC
3、准确式 GC
循环的末尾(非 counted 循环)
方法临返回前 / 调用方法的call指令后
可能抛异常的位置
安全点
A point during program execution at which all GC roots are known and all heap object contents are consistent. From a global point of view, all threads must block at a safepoint before the GC can run.
分代收集
标记-清除
标记-复制
标记-整理
跨代引用
字长精度,每条记录精确到机器字长。
对象精度,每条记录精确到对象。
卡精度,每条记录精确到一块内存区域。
增量式 GC
三色标记算法
根查找,需要暂停应用线程,找到根直接引用的对象。
标记阶段,和应用线程并发执行。
清除阶段。
mutator 插入黑色对象 A 到白色对象 C 的一个引用
mutator 删除了灰色对象 B 到白色对象 C 的一个引用
总结
巨人的肩膀
http://arctrix.com/nas/python/gc/
https://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html
《The Garbage Collection Handbook 》
https://www.iteye.com/blog/user/rednaxelafx R大的博客
https://www.jianshu.com/u/90ab66c248e6 占小狼的博客