判断对象是否死亡的方法:引用计数法和可达性分析算法:
1. 引用计数法:
-
优点:
- 实现简单,效率较高。
- 立即回收垃圾对象,不需要等待垃圾回收周期。
-
缺点:
- 难以解决循环引用的问题。如果两个或多个对象互相引用,导致引用计数永远不为零,即使它们已经不再被程序使用。
- 每次引用变化都需要维护计数器,增加了额外的开销。
由于循环引用的问题,引用计数法在现代垃圾回收算法中并不常用。
2. 可达性分析算法:
可达性分析是目前主流的垃圾回收算法,Java虚拟机中的垃圾收集器通常采用这种算法。具体步骤如下:
- GC Roots: 作为起点的一组对象,包括虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象等。
- 引用链: 从GC Roots出发,沿着引用关系向下搜索,形成引用链。如果一个对象到GC Roots没有任何引用链相连,说明对象不可达,即为垃圾对象。
- 回收: 将不可达的对象进行回收。
可达性分析算法能够解决循环引用的问题,且更加灵活和适用于各种情况。Java虚拟机中的垃圾回收器主要采用这种算法,如Serial GC、Parallel GC、G1 GC等。