讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是Java中的垃圾回收根节点(GCRoots)_哪些对象可以作为扫描起点

风丽酱_8745

风丽酱_8745

发布时间:2026-02-16 10:41:02

|

196人浏览过

|

来源于php中文网

原创

GC Roots 是 JVM 可达性分析中认定“一定存活”的引用入口,包括栈帧局部变量、JNI 引用、static 字段、synchronized 对象和 JVM 内部对象;它们不依赖业务逻辑,而是由规范与运行时状态决定,错误持有会导致内存泄漏。

什么是java中的垃圾回收根节点(gcroots)_哪些对象可以作为扫描起点

GC Roots 是什么:不是对象,是“活的起点”

GC Roots 不是某类特殊对象,而是 JVM 在做可达性分析时认定“一定存活、不能回收”的一组引用入口。只要从这些入口出发能触达的对象,就认为还在用;触达不到的,才可能被回收。

关键点在于:它们的存在不依赖于对象是否“有用”,而取决于 JVM 规范和运行时状态。比如一个正在执行的方法里的局部变量 obj,哪怕它后面再也不用了,只要栈帧还在,obj 就算 GC Root。

  • 常见错误现象:OutOfMemoryError: GC overhead limit exceeded 有时就因为本该被回收的对象被 GC Root 错误持有了(比如静态集合不断 add)
  • 不是所有“全局变量”都是 GC Root:只有明确在规范里列出来的几类才算,比如 static 字段、JNI 引用、Java 栈帧中的局部变量等
  • JVM 实现差异会影响具体哪些东西算 Root:HotSpot 把“正在执行的本地方法栈里的 JNI 引用”也纳入,但某些嵌入式 JVM 可能不支持

哪些引用算 GC Root:按 JVM 规范列清楚

Java 虚拟机规范没强制规定具体实现,但 HotSpot 的实际行为非常稳定,以下五类最常遇到:

  • Java 方法栈中每个栈帧的局部变量表里的引用(包括参数、临时变量)
  • 本地方法栈中 JNI 的 jobject(比如通过 env->NewGlobalRef() 创建的全局引用)
  • 所有 static 字段(注意:字段本身是 Root,它引用的对象不是)
  • 正在被同步的 synchronized 对象(即 monitor 持有者,如 synchronized(obj) 中的 obj)
  • JVM 内部对象:如系统类加载器、重要的异常对象(NullPointerException 实例)、常量池中字符串等

容易踩的坑:ThreadLocal 的值本身不是 GC Root,但它持有的 ThreadLocalMap 是当前线程栈的一部分,所以线程没结束前,其中的 value 很难被回收——这也是内存泄漏高发区。

立即学习“Java免费学习笔记(深入)”;

为什么 static 字段容易引发内存泄漏

因为 static 字段属于类,而类对象由系统类加载器加载,系统类加载器本身是 GC Root,所以整个引用链锁死:GC Root → 类对象 → static 字段 → 实际对象。

  • 典型场景:缓存用 public static Map<string object> cache = new HashMap();</string>,忘了清理过期项
  • 参数差异:WeakHashMap 的 key 是弱引用,不会阻止 key 被回收;但 static HashMap 的 key 和 value 都强引用,全卡死
  • 性能影响:这类对象长期驻留老年代,触发 Full GC 频率上升,且 CMS 或 G1 都无法绕过它做回收

实操建议:除非真需要进程级生命周期,否则别用 static 持有业务对象;改用 WeakReference 包一层,或交给 Spring 容器管理作用域。

如何验证某个对象是不是被 GC Root 持有

靠猜没用,得用工具看实际引用链。JDK 自带 jmap + jhat(已废弃)或更推荐 jcmd + jvisualvm / VisualVM 插件,或者直接用 jdk.jfr 录制 GC 事件。

  • 快速命令:jcmd <pid> VM.native_memory summary</pid> 看内存分布,再用 jmap -histo:live <pid></pid> 看存活对象数量
  • 关键操作:用 VisualVM 打开 heap dump 后,右键对象 → “Merge shortest paths to GC Roots”,它会列出所有可到达路径
  • 注意兼容性:JDK 17+ 默认禁用 java.lang.ref.Finalizer,所以旧版 dump 中常见的 “Finalizer” Root 在新版本里基本消失

复杂点在于:同一个对象可能被多个 Root 同时持有,而工具只显示“最短路径”,容易漏掉真正的问题源头。这时候得结合代码逻辑,逐条比对每条路径上的变量生命周期。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2691

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

497

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6679

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4745

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1990

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn