Java 中怎么分析 Heap Dump 里的支配树 Dominator Tree

胖敏酱_7063

胖敏酱_7063

2026-09-18

291人浏览

原创

支配树的核心是识别“谁真正持有对象、谁阻止对象被回收”,其根为gc roots,每个节点的直接支配者是所有通往它的路径必经的最近对象,反映强可达性下的真实内存控制权。

java 中怎么分析 heap dump 里的支配树 dominator tree

分析 Heap Dump 中的支配树(Dominator Tree),核心是理解“谁真正持有对象、谁阻止了对象被回收”,而不是只看引用链长度或对象数量。它帮你快速定位内存泄漏的根因,比如某个本该被释放的缓存容器,却因为被一个静态字段意外强引用而活了下来。

什么是支配树?关键要懂“支配”关系

在支配树中,如果对象 A 是对象 B 的支配者(Dominator),意味着:从 GC Roots 到 B 的**每一条可达路径都必须经过 A**。换句话说,只要 A 被回收,B 就一定不可达(除非有其他非支配路径,但支配树已确保这是唯一入口)。所以树的根是 GC Root,每个节点只有一父节点(直接支配者),子节点是它“支配”的所有对象。

这和普通引用树完全不同——引用树可能发散、重复、包含弱/软引用;支配树是精简、唯一、强可达性的拓扑结构,反映真实的内存“控制权”。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

用 Eclipse MAT 打开支配树视图

MAT(Memory Analyzer Tool)是最常用且对支配树支持最完善的工具:

  • 打开 .hprof 文件后,点击菜单 Reports → Dominator Tree,或直接点右上角“Dominator Tree”标签页
  • 默认按“Retained Heap”降序排列——这个值最关键:表示如果删除该对象,**能立即释放多少堆内存**(即它支配的所有对象的 shallow heap 总和)
  • 勾选右上角 “Group by package/class”“Group by superclass”,快速聚焦可疑类型(如大量 HashMap、ArrayList、自定义 Service 类)
  • 双击某行进入“Merge Shortest Paths to GC Roots”,查看它为什么还活着——这里显示的是**实际起作用的强引用链**(自动过滤掉虚/弱/软引用)

识别典型泄漏模式:看 retained heap + 引用链

支配树本身不告诉你“为什么错”,但结合上下文能快速锁定问题:

  • 单个对象 retained heap 特别大(比如 >100MB):大概率是缓存未清理、日志堆积、大数组未释放。点开它,看它的 field 值(如 map.size、list.size)、所属类名、创建位置(如果有行号信息)
  • 某个工具类或监听器实例出现在支配树靠前位置,retained heap 中等但数量多:检查是否注册了监听器没反注册、ThreadLocal 没 remove、匿名内部类持有了 Activity/Fragment(Android)或 ServletContext(Web)
  • java.util.HashMap 或 ConcurrentHashMap 占主导,且 key 是业务对象:重点查 key 是否没实现 hashCode/equals、或 value 持有外部强引用导致整张 map 无法回收
  • 线程对象(java.lang.Thread)retained heap 高:说明该线程还在运行,且它栈帧里的局部变量或 ThreadLocal 可能持有大量对象——看 “Thread Stack” 视图,找长生命周期对象

进阶技巧:用 OQL 定制查询 + 对比快照

支配树是静态快照,复杂问题需动态验证:

  • 在 MAT 的 OQL Console 中执行:SELECT * FROM java.util.HashMap WHERE @retainedHeap > 5000000,直接筛选 retained heap 超 5MB 的 HashMap
  • 用两个时间点的 dump(正常态 vs OOM 前)做 Compare Blame:MAT 会高亮 retained heap 增长最多的类和实例,比单看一棵树更准
  • 导出支配树为 CSV(右键 → Export to CSV),用 Excel 筛选 “Class Name” 和 “Retained Heap”,加一列计算 “Retained per Instance” = Retained Heap / Objects,找出“单个实例吃内存”的罪魁

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8717

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5922

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5332

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

964

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1136

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2309

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19651

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1055

8

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习