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

相关推荐
砍材农夫14 小时前
spring-ai 第四多模态API
java·人工智能·spring
她说..17 小时前
Java 对象相关高频面试题
java·开发语言·spring·java-ee
庞轩px17 小时前
深入理解 sleep() 与 wait():从基础到监视器队列
java·开发语言·线程··wait·sleep·监视器
皮皮林55118 小时前
面试官:ZSet 的底层实现是什么?
java
yangyanping2010818 小时前
Go语言学习之对象关系映射GORM
jvm·学习·golang
网络工程小王18 小时前
【Transformer架构详解】(学习笔记)
笔记·学习
码云数智-大飞18 小时前
C++ RAII机制:资源管理的“自动化”哲学
java·服务器·php
2601_9498165818 小时前
Spring+Quartz实现定时任务的配置方法
java
计算机毕设指导619 小时前
基于SpringBoot校园学生健康监测管理系统【源码文末联系】
java·spring boot·后端·spring·tomcat·maven·intellij-idea
RInk7oBjo20 小时前
spring-事务管理
数据库·sql·spring