Java GC通过可达性分析判断对象是否可回收:从GC Roots(如虚拟机栈引用、静态变量、常量池对象等)出发,不可达的对象即为可回收对象;强引用不回收,软/弱/虚引用按规则延迟或通知回收。

Java 垃圾回收(GC)判断对象是否可回收,核心依据是该对象是否还被“可达”(reachable)——即从一组称为“GC Roots”的根对象出发,能否通过引用链访问到它。如果无法到达,就视为可回收对象。
哪些对象属于 GC Roots?
GC Roots 是 JVM 认为“一定存活”的起点,包括:
- 虚拟机栈(栈帧中的局部变量表)中引用的对象
- 本地方法栈中 JNI(Native 方法)引用的对象
- 方法区中类静态属性引用的对象(如 public static Object obj)
- 方法区中常量引用的对象(如字符串常量池里的字符串)
- 被同步锁(synchronized)持有的对象
- JVM 内部特殊对象,如基本类型对应的 Class 对象、系统类加载器等
可达性分析:从根开始“扫描”
JVM 会以这些 GC Roots 为起点,沿着引用关系(普通引用、软引用、弱引用、虚引用的处理规则不同)进行深度或广度优先遍历。所有能被遍历到的对象标记为“存活”,其余未被标记的对象即为“不可达”,进入待回收队列。
注意:这不是实时检测,而是在 GC 触发时的一次性分析过程;对象是否“正在使用”不靠计数或时间戳,只看引用链是否存在。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
四种引用类型影响回收时机
即使对象不可达 GC Roots,不同引用类型也会改变其回收行为:
- 强引用(Strong Reference):如 Object obj = new Object()。只要强引用存在,GC 永远不会回收它。
- 软引用(SoftReference):内存不足时才回收,适合缓存场景。
- 弱引用(WeakReference):下一次 GC 时就会被回收,常用于 WeakHashMap。
- 虚引用(PhantomReference):无法通过它获取对象实例,仅用于在对象被回收前收到通知(需配合 ReferenceQueue)。
特殊情况:对象可能“复活”?
在对象的 finalize() 方法(已自 Java 9 起标记为 deprecated,不推荐使用)中,若重新与 GC Roots 建立强引用(如赋值给某个静态变量),该对象会在本次 GC 中被“救活”,不被回收。但 finalize() 最多只会被调用一次,且性能差、行为不确定,应避免依赖。

















