![d234d6f32bb875c856092e0c588f3eb5.png](https://i-blog.csdnimg.cn/blog_migrate/4b23998bffb9ca07d3087c6aef9b1144.jpeg)
欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!
Java架构筑基zhuanlan.zhihu.com![97589d03309db9ed3c5ba063c850562f.png](https://i-blog.csdnimg.cn/blog_migrate/f7e635c70eaa88bd0c14475287913c66.jpeg)
- Java架构筑基——专注于Java技术的研究与分享!
- 后续文章将首发此专栏!
- 欢迎各位Java工程师朋友投稿和关注
- # 链接 Java程序员福利"常用资料分享"
在 JVM 中 GC 的回收机制也是非常重要的一块,废话不多说,先上张图
![64dcad5aff099517a2962ba8e4ac9be6.png](https://i-blog.csdnimg.cn/blog_migrate/18ceb069d2ce4042bcbbd559b4ff6527.jpeg)
一、如何确定垃圾
①. 引用计数法
每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
②. 可达性分析
为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的GC roots
对象作为起点搜索。如果在GC roots
和一个对象之间没有可达路径,则称该对象是不可达的。
要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。
1. GC对象标记过程
第一次标记:
- 如果对象在可达性分析后没有与GC Roots相连接的引用链,将第一次被标记,并进行一次筛选,筛选条件为是否有必要执行finalize()方法,
- 没有必要执行finalize()方法,便将这对象放置F-Queue队列中,并在稍后由一个虚拟机自动建立的、低优先级的Finalizer线程去执行它(指触发这个方法);
- "没必要执行"的两种情况:当对象没有覆盖finalize(),或者此方法已经被虚拟机调用过
第二次标记:
- 稍后GC将对F-Queue中的对象进行第二次标记,如果对象在finalize()方法中成功拯救自己(重新与引用链上的任一对象建立关联),它将被移出“即将回收”集合,否则,被回收