GC标记算法:引用计数 vs 可达性分析
请对比引用计数法和可达性分析算法的工作原理、优缺点,并说明为什么主流JVM选择可达性分析。
回答
编译有声
引用计数法:
- 原理:每个对象维护引用计数器,有引用则+1,引用失效则-1,为0时回收。
- 优点:简单高效,实时性高。
- 缺点:无法解决循环引用问题;需要额外空间存储计数器;更新频繁影响性能。
可达性分析(根搜索算法):
- 原理:从GC Roots(栈帧本地变量、静态变量、JNI引用、活跃线程、同步监视器等)向下搜索,不可达的对象判定为可回收。
- 优点:能解决循环引用问题。
- 缺点:需要STW(Stop-The-World)保证一致性。
主流JVM选择可达性分析,因为能正确处理循环引用,且在停顿时间可接受范围内。引用计数法主要用在Python、PHP等语言中。