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

相关推荐
2601_96207100几秒前
【Java EE】SpringBoot的创建与简单使用
spring boot·后端·java-ee
2601_967338718 分钟前
尚硅谷2026尚硅谷Java全栈+Python智能体教程
java·人工智能
摇滚侠18 分钟前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发进阶 阅读笔记 24
spring boot·笔记·后端
摇滚侠26 分钟前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 22
javascript·spring boot·笔记
孙克旭_33 分钟前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
Titan202434 分钟前
HTTPS基础知识梳理
服务器·网络·c++·网络协议·学习·http·https
艾莉丝努力练剑37 分钟前
【AI大模型接入SDK】SSE协议
c++·学习·面试·大模型·sdk
2601_9619017039 分钟前
SpringCloud2023集成Nacos2.4.3
java
玄昌盛不会编程40 分钟前
LeetCode——2091. 从数组中移除最大值和最小值
java·算法·leetcode
Rain的Java大神之路43 分钟前
如何保证接口幂等
java·经验分享·后端·面试·架构