JVM学习——Gc Roots

一、GC Roots 通俗理解

GC Roots(垃圾回收根节点)是 Java 垃圾回收(GC)机制的核心判断依据,可以把它理解成:

JVM 内存中 "不会被回收的固定锚点",所有能直接 / 间接被 GC Roots 引用的对象,都是 "存活对象";反之,无法被 GC Roots 关联的对象,就是 "垃圾对象",会被 GC 清理。

打个比方:GC Roots 就像大树的 "主根",所有和主根相连的 "枝干 / 叶子"(对象引用)都是活的,断了连接的叶子就会被清理。

二、GC Roots 包含哪些类型(核心分类)

只有以下几类对象能成为 GC Roots,记这 4 类核心即可:

  1. 虚拟机栈(栈帧)中的局部变量 / 参数

    比如方法执行时,方法里定义的对象引用(

    复制代码
    User user = new User()

    中的 user),只要方法还在运行,这个引用就是 GC Roots。

  2. 方法区中的静态变量

    类的静态成员变量(

    复制代码
    public static User instance;

    ),因为类的静态变量属于类本身,类加载后一直存在,所以是 GC Roots。

  3. 方法区中的常量引用

    比如字符串常量池里的常量(

    复制代码
    final String NAME = "张三"

    ),常量不会被回收,对应的引用也是 GC Roots。

  4. 本地方法栈中的本地方法(JNI)引用

    调用 C/C++ 本地方法时,本地方法持有的 Java 对象引用(比如 Java 调用 Native 方法传递的对象)。

三、GC Roots 工作原理

java 复制代码
public class GCRootsDemo {
    // 静态变量 → 属于 GC Roots
    public static User staticUser = new User(); 

    public void test() {
        // 局部变量 → 属于 GC Roots(方法执行时)
        User localUser = new User(); 
        // 临时变量 → 方法执行完后,localUser 出栈,不再是 GC Roots
        localUser = null; 
    }
}

class User {}

staticUser 是静态变量,永远属于 GC Roots,它引用的 User 对象不会被回收;

localUsertest() 方法执行时是 GC Roots,方法执行结束后,localUser 从栈帧中消失,若此时没有其他引用指向这个 User 对象,该对象就会被判定为垃圾。

相关推荐
Flittly5 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了5 小时前
Java 生成二维码解决方案
java·后端
人活一口气10 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP11 小时前
Vibe Coding -- 完整项目案例实操
java
荣码11 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing11 小时前
Google第三方授权登录
java·后端·程序员
明月光81811 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑21 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯21 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路1 天前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java