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

相关推荐
阿坤带你走近大数据4 分钟前
分别介绍下java主流的开发框架、设计模式与对应编程语言的高级特性
java·开发语言·设计模式
段一凡-华北理工大学5 分钟前
工业领域的Hadoop架构学习~系列文章24:adoop工业应用总结与展望 - 技术路线图与最佳实践
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
摇滚侠6 分钟前
Spring 零基础入门到进阶 基于 XML 的声明式事务 71
xml·数据库·spring
番茄去哪了13 分钟前
一篇文章讲懂SDN
java·spring
AC赳赳老秦18 分钟前
OpenClaw + 华为云自动化:批量管理云资源、生成月度云账单分析与成本优化报告
java·开发语言·javascript·人工智能·python·mysql·openclaw
一锅炖出任易仙18 分钟前
创梦汤锅学习日记day30
学习·ai·ue5·游戏引擎
我是一颗柠檬24 分钟前
【Java项目技术亮点】读写分离+主从延迟处理:MySQL高并发下的性能优化方案
java·分布式·mysql·性能优化
qq_25183645724 分钟前
基于java Web 哈尔滨文化活动网站毕业论文
java·开发语言·前端
Java知识技术分享26 分钟前
安装sourcetree
java·git·源代码管理
AOwhisky31 分钟前
Redis 学习笔记(第二期):核心数据类型与消息队列实战
运维·数据库·redis·笔记·学习·云计算