java不采用引用计数法,因其无法处理循环引用导致内存泄漏,且存在性能开销、空间浪费及不支持引用强度语义等问题;jvm实际使用可达性分析算法,以gc roots为起点标记不可达对象进行回收。

Java 中并不使用引用计数法来判断对象是否存活,但理解它的原理和缺陷,有助于深入掌握 JVM 的垃圾回收机制。
引用计数法的基本判断逻辑
该方法为每个对象维护一个整型计数器:
- 每当有新变量、字段或栈帧中引用该对象时,计数器 +1
- 当引用失效(如变量赋值为 null、方法结束、局部变量出栈)时,计数器 −1
- 若某时刻计数器值为 0,即表示“没有任何地方再指向它”,该对象被判定为死亡,可立即回收
引用计数法的核心缺陷:无法处理循环引用
这是它被 HotSpot JVM 明确弃用的最主要原因:
- 对象 A 持有对象 B 的引用,B 同时持有 A 的引用;两者外部再无其他引用
- 此时 A 和 B 的计数器均 ≥1,即使它们已脱离业务逻辑、不可达,也不会被回收
- 造成内存泄漏——对象实际已“死亡”,却因计数非零而长期驻留堆中
为什么 Java 虚拟机不采用它
除循环引用外,还有几个现实制约:
- 每次读写引用都要同步更新计数器,带来额外性能开销(尤其在多线程环境下需原子操作)
- 计数器本身占用内存,对小对象而言比例显著,浪费空间
- 无法区分强引用、软引用、弱引用等语义,难以支持现代 GC 的精细化回收策略
Java 实际使用的替代方案:可达性分析算法
HotSpot 等主流 JVM 均采用此算法,其核心是:
- 以 GC Roots(如虚拟机栈中的局部变量、静态字段、常量池项、JNI 引用等)为起点
- 沿引用链向下遍历所有可达对象
- 不可达的对象才被标记为可回收——天然规避了循环引用问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











