GC Roots包括虚拟机栈局部变量、JNI引用、静态属性、常量引用及JVM内部关键对象;它们是可达性分析的起点,从这些根出发不可达的对象即被判定为可回收。

Java 垃圾回收(GC)判断对象是否可回收,核心依据是对象是否还被“可达”(reachable)——即从一组称为“GC Roots”的根对象出发,能否通过引用链访问到该对象。不可达的对象才被视为可回收。
哪些对象属于 GC Roots?
GC Roots 是 JVM 认为“一定存活”的起点,包括:
- 虚拟机栈(栈帧中的局部变量表)中引用的对象
- 本地方法栈中 JNI(Native 方法)引用的对象
- 方法区中类静态属性引用的对象(如 public static Object obj)
- 方法区中常量引用的对象(如字符串常量池里的字符串)
- JVM 内部的特殊对象,如基本类型的 Class 对象、系统类加载器等
可达性分析:从根出发的引用链追踪
JVM 会暂停应用线程(STW),以 GC Roots 为起点,沿着所有引用关系(包括强引用、软引用、弱引用、虚引用,但不同引用类型影响回收时机)进行图遍历。如果一个对象无法从任何 GC Root 经过引用链到达,它就被标记为“不可达”,进入待回收队列。
注意:循环引用不会阻止回收。例如 A 引用 B,B 引用 A,但两者都不被 GC Roots 引用 → 二者都会被回收。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
四种引用类型决定回收优先级
即使对象不可达 GC Roots,引用类型也会影响是否立即回收:
- 强引用(Strong Reference):最常见,如 Object obj = new Object()。只要强引用存在,GC 永远不回收。
- 软引用(SoftReference):内存不足时才回收,适合缓存场景。
- 弱引用(WeakReference):每次 GC 都尝试回收,常用于 WeakHashMap 的键。
- 虚引用(PhantomReference):无法通过它获取对象,仅用于在对象被回收后收到通知(需配合 ReferenceQueue)。
finalize() 不再推荐使用
早期 Java 提供 finalize() 方法作为对象回收前的“临终回调”,但因性能差、行为不确定、易导致内存泄漏,自 Java 9 起已标记为 @Deprecated,Java 21 中正式移除。应改用 Cleaner 或显式资源管理(try-with-resources)。

















