判断对象是否存活的方法有两种,分别是引用计数法
、可达性分析算法
。
注:如无特殊说明,本文所有图的来源为《深入理解Java虚拟机JVM高级特性与最佳实践》
1、引用计数法
- 引用计数法是指给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器为0的对象就是不可能再被使用的。
- 缺点是它很难解决对象之间相互循环引用的问题。举个简单的例子,对象objA和obB都有字段Instance,赋值令 obja instance=objB及obiB. Instance=ojA,除此之外,这两个对象再无任何引用,实际上这两个对象已经不可能再被访问,但是它们因为互相引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。
2、可达性分析算法
主要通过一系列的称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即从GC Roots到这个对象不可达)时,则证明对象是不可用的。