1 如何确定垃圾
java 采用引用计数法与可达性分析来确定是否回收垃圾。其中引用计数法会容易产生循环引用的问题。可达性分析通过根搜索算法来实现。根
搜索算法以一系列GC Root s 的点作为起点向下搜索,在一个对象到任何GC Root s 都没
有引用链相连时,说明其已经死亡。
2 接下来来谈谈 引 用计数法循环引用的问题
在Java 中如果要操作对象,就必须先获取该对象的引用,因此可以通过引用计数法
来判断一个对象是否可以被回收。在为对象添加一个引用时,引用计数加l ;在为对象删
除一个引用时, 引进计数减l ;如果一个对象的引用计数为0 ,则表示此刻该对象没有被
引用,可以被回收。
引用计数法容易产生循环引用问题。循环引用指两个对象相互引用,导致它们的引
用一直存在,而不能被回收,
如图1 - 7 所示, Object !与Object2 互为引用,如果采用引
用计数法,则Object I 和Object2 由于互为引用,其引用计数一直为l ,因而无法被回收。
可达性分析为了解决引用计数法的循环引用问题, Java 还采用了可达性分析来判断对象是否可以被回收。
具体做法是首先定义一些GC Root s 对象,然后以这些GC Roots 对象作为起
点向下搜索,如果在GC roots 和一个对象之间没有可达路径, 则称该对象是不可达的。
不可达对象要经过至少两次标记才能判定其是否可以被回收,如果在两次标记后该对象
仍然是不可达的,则将被垃圾收集器回收。