GC Roots 是判定对象是否存活的起点,包括虚拟机栈中局部变量引用的对象、方法区中静态变量和常量引用的对象、本地方法栈中 JNI 引用的对象,以及部分 JVM 实现中正在执行同步块的锁对象。

根搜索算法中,GC Roots 是判定对象是否存活的起点。只有从这些根对象出发、能通过引用链到达的对象才被视为“可达”,其余一律视为可回收垃圾。
虚拟机栈中的局部变量引用的对象
每个线程的虚拟机栈中,当前正在执行的方法的栈帧里,本地变量表中存储的引用(比如方法参数、局部变量)所指向的对象,都属于 GC Roots。例如一个方法内定义 String s = new String("hello");,只要该方法还没执行完、s 还在作用域内,这个字符串对象就不会被当作垃圾。
方法区中静态变量和常量引用的对象
类的静态属性(static 字段)所引用的对象,以及方法区中运行时常量池里的常量(如字符串字面量、类名符号引用等)所指向的对象,也都是 GC Roots。比如 public static List
本地方法栈中 JNI 引用的对象
Java 调用 Native 方法(通过 JNI)时,如果 C/C++ 代码中持有 Java 对象的引用(比如 jobject),这些被 JNI 全局引用或局部引用(未被 DeleteLocalRef)的对象,也会被 JVM 视为 GC Roots。这类引用需谨慎管理,否则容易造成内存泄漏。
正在执行同步块的锁对象(部分 JVM 实现)
某些 JVM 实现(如 HotSpot 在特定版本)会将处于同步块(synchronized)中、作为锁对象且尚未退出临界区的对象也纳入 GC Roots,确保其不会在加锁期间被回收。但这不是 JVM 规范强制要求,属于实现细节,不作为通用标准。

















