引用计数法和可达性分析算法

237 阅读1分钟

判断对象是否死亡的方法:引用计数法和可达性分析算法:

1. 引用计数法:

  • 优点:

    • 实现简单,效率较高。
    • 立即回收垃圾对象,不需要等待垃圾回收周期。
  • 缺点:

    • 难以解决循环引用的问题。如果两个或多个对象互相引用,导致引用计数永远不为零,即使它们已经不再被程序使用。
    • 每次引用变化都需要维护计数器,增加了额外的开销。

由于循环引用的问题,引用计数法在现代垃圾回收算法中并不常用。

2. 可达性分析算法:

可达性分析是目前主流的垃圾回收算法,Java虚拟机中的垃圾收集器通常采用这种算法。具体步骤如下:

  • GC Roots: 作为起点的一组对象,包括虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象等。
  • 引用链: 从GC Roots出发,沿着引用关系向下搜索,形成引用链。如果一个对象到GC Roots没有任何引用链相连,说明对象不可达,即为垃圾对象。
  • 回收: 将不可达的对象进行回收。

可达性分析算法能够解决循环引用的问题,且更加灵活和适用于各种情况。Java虚拟机中的垃圾回收器主要采用这种算法,如Serial GC、Parallel GC、G1 GC等。