CodeWalk

GC标记算法:引用计数 vs 可达性分析

作者:编译有声 · 2026-05-30 12:55

请对比引用计数法和可达性分析算法的工作原理、优缺点,并说明为什么主流JVM选择可达性分析。

回答

编译有声

引用计数法

  • 原理:每个对象维护引用计数器,有引用则+1,引用失效则-1,为0时回收。
  • 优点:简单高效,实时性高。
  • 缺点:无法解决循环引用问题;需要额外空间存储计数器;更新频繁影响性能。

可达性分析(根搜索算法)

  • 原理:从GC Roots(栈帧本地变量、静态变量、JNI引用、活跃线程、同步监视器等)向下搜索,不可达的对象判定为可回收。
  • 优点:能解决循环引用问题。
  • 缺点:需要STW(Stop-The-World)保证一致性。

主流JVM选择可达性分析,因为能正确处理循环引用,且在停顿时间可接受范围内。引用计数法主要用在Python、PHP等语言中。