0

0

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

P粉602998670

P粉602998670

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

|

176人浏览过

|

来源于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免费学习笔记(深入)”;

搜狐资讯
搜狐资讯

AI资讯助手,追踪所有你关心的信息

下载

为什么 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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

134

2025.08.06

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

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

81

2026.01.26

string转int
string转int

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

750

2023.08.02

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

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

1552

2023.10.24

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

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

85

2025.09.18

python 全局变量
python 全局变量

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

101

2025.09.18

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

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

552

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.6万人学习

C# 教程
C# 教程

共94课时 | 9.6万人学习

Java 教程
Java 教程

共578课时 | 66.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号