使用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进行内存问题定位的主要内容,如果未能解决你的问题,请参考以下文章

MAT实战:JVM内存溢出的定位与分析

Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用 | 寻找C站宝藏

线上解决OOM-MAT工具实操

更改 Angular 9 mat-input 的初始颜色

如何使用共享内存在 cpp 和 python 之间共享 cv::Mat 以进行处理

使用Mat分析大堆信息