使用MAT进行内存问题定位
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用MAT进行内存问题定位相关的知识,希望对你有一定的参考价值。
文章目录
MAT简介
MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。
https://www.eclipse.org/mat/downloads.php --下载地址
http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html --官网使用教程
可调参数
文件名称:MemoryAnalyzer.ini
参数-Xmx 6144m
参数-data
如何使用MAT
1、如何找到占用内存多的java进程号
使用Linux的top命令
2、使用jmap生成java程序的当前堆快照
jmap -dump:format=b,file=java_pid718.hprof 718
./jmap -dump:format=b,file=/opt/logs/java_pid27258.hprof 27258
Q: well-known file is not secure
A:pid的启动用户不是当前用户,需要切换到启动用户下执行jmap即可
3、利用MAT生成报告
相关命令: ./ParseHeapDump.sh javapid_6838.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
会产生三个文件夹java_pid718_Leak_Suspects.zip java_pid718_System_Overview.zip java_pid718_Top_Components.zip
**浅堆 shallow heap **
指对象本身占用内存的大小 不包括内部引用对象的大小。
深堆 retained heap
一个对象的深堆指的是通过g该对象的反问道的所有对象的浅堆之和,即对象被回收后,可以释放的真实空间。
报告解读
系统视图报告 System_Overview.zip
- Thread Overview
在Thread Overview视图可以看到:线程对象/线程栈信息、线程名、Shallow Heap、Retained Heap、类加载器、是否Daemon线程等信息
-
Top Consumers
通过图形列出最大的object -
Class Histogram
该视图以Class类的维度展示每个Class类的实例存在的个数、 占用的 [Shallow内存] 和 [Retained内存] 大小 -
Heap Dump Overview
-
System Properties
内存泄露检测报告 Leak_Suspects.zip
内存泄露的概念:
1、内存泄露的这些对象是从GC root可达的,从GC root存在通路可以与其相连
2、这些对象是无用的,即程序以后不会再使用这些对象
至于怎么定义程序不会再使用的对象,那就要看具体的程序逻辑了,说白了内存泄露就是该回收的内存没有被回收
MAT工具分析了heap dump后在界面上非常直观的展示了一个饼图,该图深色区域被怀疑有内存泄漏。
分析对象属于同一个包或者被同一个类加载器加载Top_Components.zip
以上是关于使用MAT进行内存问题定位的主要内容,如果未能解决你的问题,请参考以下文章
Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用 | 寻找C站宝藏