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 对象,该对象就会被判定为垃圾。

相关推荐
sdanss2 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
金銀銅鐵2 小时前
Byte Buddy 生成的类的结构如何?(第一篇)
java·后端
sxhcwgcy2 小时前
Spring Cloud GateWay搭建
java
umeelove352 小时前
Spring框架
java·后端·spring
彭于晏Yan2 小时前
Spring Boot中适配器模式的实现方式
spring boot·设计模式·适配器模式
baizhigangqw2 小时前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
pangares2 小时前
Spring Boot文件上传
java·spring boot·后端
wang09072 小时前
JVM即时编译器JIT以及常见优化
jvm·jit·标量替换
zhglhy2 小时前
Java分布式链路技术
java·分布式·分布式链路