2020-hprof 文件分析工具:JVM 内存分析工具MAT
hprof 文件分析工具:JVM 内存分析工具MAT
1 简介
2 使用
2.1 准备MAT
下载独立版本的
2.2 准备堆转储文件(Heap Dump)
堆转储文件

- 所有的对象信息,包括对象实例、成员变量、存储于栈中的基本类型值和存储于堆中的其他对象的引用值。
- 所有的类信息,包括
classloader 、类名称、父类、静态变量等。 GC Root 到所有的这些对象的引用路径。- 线程信息,包括线程的调用栈及此线程的线程局部变量
(TLS) 。
多种方式获取堆转储文件:
- 通过
jmap 命令可以在cmd 里执行:jmap -dump:format=b,file= 。 - 如果想在发生内存溢出的时候自动
dump ,需要添加下面JVM 参数:-XX:+HeapDumpOnOutOfMemoryError。 - 使用
Ctrl+Break 组合键主动获取获取,需要添加下面JVM 参数:-XX:+HeapDumpOnCtrlBreak。 - 使用
HPROF Agent 可以在程序执行结束时或受到SIGOUT 信号时生成Dump 文件,配置在虚拟机的参数如下:-agentlib:hprof=heap=dump,format=b。 - 使用
JConsole 获取。 - 使用
Memory Analyzer Tools 的File -> Acquire Heap Dump 功能获取。
2.3 分析堆转储文件
打开

常用的两个功能:Histogram、 Leak Suspects。
2.3.1 Histogram

- Class Name:类名称,
Java 类名。 - Objects:类的对象的数量,这个对象被创建了多少个。
- Shallow Heap:对象本身占用内存的大小,不包含其引用的对象内存,实际分析中作用不大。常规对象
( 非数组) 的Shallow Size 由其成员变量的数量和类型决定。数组的Shallow Size 由数组元素的类型( 对象类型、基本类型) 和数组长度决定。对象成员都是些引用,真正的内存都在堆上,看起来是一堆原生的byte[], char[], int[] ,对象本身的内存都很小。 - Retained Heap:计算方式是将
Retained Set( 当该对象被回收时那些将被GC 回收的对象集合) 中的所有对象大小叠加。或者说,因为X 被释放,导致其它所有被释放对象( 包括被递归释放的) 所占的heap 大小。Retained Heap 可以更精确的反映一个对象实际占用的大小。
16*100 + X
的内存,

在上述列表中选择一个

继续选择一个对象,右键选择****
,通常在排查
这时会拿到
2.3.2 Leak Suspects


比如:这里问题一的描述,列出了一些比较大的实例。点击

在
实战:在某项目中,其中几个
Tomcat 响应特别慢,打开Java VisualVM 观察Tomcat(pid xxx)-Visual GC 发现Spaces-Old 升高,Graphs-GC Time 比较频繁且持续时间长、有尖峰( 重启后过段时间又出现了) ,最后通过Leak Suspects 中的See stacktrace 定位到某个查询接口,仔细排查代码后发现有个BUG :在特定查询条件下会一次性查询几万的数据出来( 因为脏数据) ,处理过后恢复正常。

2.3.3 内存快照对比
为了更有效率的找出内存泄露的对象,一般会获取两个堆转储文件
