
如何判断对象已死:可达性分析与引用体系本文是《JVM调优实战》专栏第 8 讲。在上一讲中,我们讨论了 JVM 的运行时数据区域,知道了堆是垃圾收集的主要战场。那么问题来了:堆里面躺着成千上万的对象,GC 怎么知道哪些对象还"活着"、哪些已经"死了"该被回收?这个问题看似简单,却是所有 GC 算法的基石。判断不准,要么漏回收(内存泄漏),要么误回收(程序崩溃)。本讲我们就来深入剖析 JVM 判断对象存活的两大流派——引用计数法与可达性分析,以及 Java 独特的四种引用体系。引用计数法:最直观的方案引用计数法的思路非常朴素:给每个对象维护一个计数器,每当有一个引用指向它,计数器加 1;每当引用失效(比如离开作用域或被重新赋值),计数器减 1。计数器为 0 的对象就是"死了",可以回收。打个比方,这就像图书馆的借阅管理——一本书被借走时记录借出数,归还时减去。当借出数为 0,说明没人需要这本书了,可以下架。这个方案实现简单,判断效率高,甚至可以在对象赋值时同步完成回收,不需要专门的 GC 停顿。但它有一个致命缺陷:无法处理循环引用。publicclassReferenceCountingGC