判断对象是否是垃圾主要有两种方法:
- 引用计数法: 该方法基于引用计数器,每个对象都有一个引用计数,当有引用指向该对象时,计数加 1,引用失效时计数减 1。如果计数器为 0,则该对象被标记为垃圾。这种方法存在循环引用的问题,即两个或多个对象相互引用,导致引用计数永远不为零,即使它们已经不再被程序使用。
- 可达性分析: 这是现代主流的垃圾回收算法使用的方法。从一组称为 GC Roots 的根对象出发,通过对象之间的引用关系,进行可达性分析,即判断对象是否能够被一系列的引用链达到。如果对象不可达,说明该对象不再被程序所引用,即为垃圾。GC Roots 包括虚拟机栈和本地方法栈中引用的对象、类静态属性引用的对象、常量引用的对象等。
可达性分析是目前主流的垃圾回收算法的基础,如Java中的标记-清除算法、标记-整理算法、复制算法等。这种方法能够有效地处理循环引用的情况,因为循环引用的对象组合不会构成一个有效的引用链。