[转帖]jvm学习三-MAT内存分析工具的使用
目录
1 模拟内存溢出程序
1.1 jvm配置
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./logs/gc.log -Xms32m -Xmx32m -XX:MetaspaceSize=32m -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dump
1.2 测试代码
- 
private Executor executor = Executors.newFixedThreadPool(5);
 
- 
 
 
- 
private Random random = new Random();
 
- 
@Test
 
- 
public void oomTest() throws InterruptedException {
 
- 
    while (true) {
 
- 
        Employee employee = new Employee(random.nextInt(100), UUID.randomUUID().toString(),
 
- 
                random.nextInt(100), new BigDecimal(random.nextDouble()));
 
- 
        executor.execute(() -> execute(employee));
 
- 
    }
 
- 
}
 
- 
 
 
- 
private void execute(Employee employee) {
 
- 
    try {
 
- 
        System.out.println(employee);
 
- 
        Thread.sleep(5000);
 
- 
    } catch (InterruptedException e) {
 
- 
        e.printStackTrace();
 
- 
    }
 
- 
}
 
2 MAT工具进行内存分析
执行上述程序后,会dump出一个文件,用MAT打开文件即可
2.1 大纲介绍

查看大纲,可以直观看到:
 总内存26.6M,大对象占用内存25.3M,以及有问题的那个类:ThreadPoolExecutor,和左侧工具栏的对象属性
2.2 Histogram视图介绍
堆内所有类的统计信息,包含类的实例数量和占用的空间。如果此处包含了自己的类就需要注意是否此类创建过多。默认的大小单位是 Bytes,可以在 Window – Preferences—Memory Analyzer-- 菜单中设置单位。笔者设置的是MB
- Shallow Size:对象自身占用的内存大小,不包括它引用的对象
 - Retained Size:被GC后Heap上释放的内存大小,即当前对象大小+当前对象可直接或间接引用到的对象的大小总和
 - out going:查看对象为什么耗内存,我们看到一个线程池占用了>25mb的内存,右键->list objects -> with outgoing references
 

 可以看到线程池中的工作队列占用内存比较大
- in going:查看对象被谁引用,右键->list objects -> with ingoing references
 

 这里我们可以清楚地定位到项目里具体哪个类引用到了该类,这里基本上可以分析出问题的原因了
2.3 Leak Suspects视图介绍

该视图会分析出可能发生内存泄漏的点,这里可以看出一个java.util.concurrent.ThreadPoolExecutor实例被系统类加载器加载,占用了94.86%的空间。该实例呗com.demo.mianshi.OOMTest的一个对象引用
 我们点开detail信息
- Shortest Paths To the Accumulation Point:累积点的最短路径
 

 可以看到线程:0xfe67d1d0累积了一个java.util.concurrent.ThreadPoolExecutor,这个视图类似于Histogram视图的in going
- Accumulated Objects in Dominator Tree:累积对象所在树
 

 可以看到该对象持有的任务队列占用内存比较大
2.4 Dominator Tree
列出了堆中的对象,并且该对象的其他对象。和Leak Suspects视图中Accumulated Objects in Dominator Tree类似
 当然,MAT还有一些其他的分析报告,这里就不一一列举了,常用的就这些,平时工作中定位问题基本上已经足够了。
[转帖]jvm学习三-MAT内存分析工具的使用的更多相关文章
- Eclipse MAT内存分析工具(Memory Analyzer Tool)
		
MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...
 - 【转】Eclipse MAT内存分析工具(Memory Analyzer Tool)
		
Eclipse MAT内存分析工具(Memory Analyzer Tool) MAT内存分析工具# MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找 ...
 - MAT内存分析工具安装指南(MAT)
		
https://blog.csdn.net/mahl1990/article/details/79298616
 - Android内存优化(三)详解内存分析工具MAT
		
前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...
 - 【Java线程与内存分析工具】VisualVM与MAT简明教程
		
目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...
 - Android内存分析工具DDMS heap + MAT 安装和使用
		
一 Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲 MAT介绍: Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...
 - JVM学习01:内存结构
		
JVM学习01:内存结构 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. 内存结构知识要点Xmind梳理 案例分析 分析1 package com.h ...
 - Java内存分析工具MAT
		
MAT是一个强大的内存分析工具,可以快捷.有效地帮助我们找到内存泄露,减少内存消耗分析工具.内存中堆的使用情况是应用性能监测的重点,而对于堆的快照,可以dump出来进一步分析,总的来说,一般我们对于堆 ...
 - MAT内存分析
		
先下载 http://www.eclipse.org/mat/downloads.php 配置环境参数 分析一个堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,建议分配给 ...
 - Android 内存分析工具 MAT(Memory Analyzer Tool)
		
如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...
 
随机推荐
- 鸿蒙轻内核M核源码分析:中断Hwi
			
摘要:本文带领大家一起剖析了鸿蒙轻内核的中断模块的源代码,掌握中断相关的概念,中断初始化操作,中断创建.删除,开关中断操作等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列五 中断Hwi&g ...
 - 用GaussDB(for Redis)存画像,推荐业务轻松降本60%
			
摘要:用户画像存储是推荐业务核心,但开源Redis无法胜任.华为云高斯Redis是最佳存储选型,轻松降本60%,同时获得企业级高稳定性. 本文分享自华为云社区<华为云GaussDB(for Re ...
 - 关于单元测试的那些事儿,Mockito 都能帮你解决
			
摘要:相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口:如何测试一个包含客户端调用服务端的复杂方法:如何测试一个包含从数据库读取数据的复杂方法...这些 ...
 - CANN 5.0黑科技解密 | 算力虚拟化,让AI算力“物尽其用”
			
摘要:算力虚拟化技术对消费者而言,可有效降低算力的使用成本,对于设备商或运营商而言,则可极大提升算力资源的利用率,降低设备运营成本. 为什么要做算力虚拟化 近年来,人工智能领域呈井喷式发展,算力就是生 ...
 - Appuploader工具让ipa上传到App Store 的最新流程和步骤
			
 苹果官方提供的工具xcode上架ipa非常复杂麻烦.用appuploader 可以在 mac 和windows 上制作管理 证书 ,无需钥匙串工具 条件:1.以Windows为例,创建app打包i ...
 - Solon 开发进阶,四、启动参数说明
			
Solon 开发进阶 一.插件扩展机制 二.体外扩展机制 三.常用配置说明 四.启动参数说明 五.全局异常订阅 启动参数,在应用启动后会被静态化(为了内部更高效的利用).比如,想通过体外扩展加载配置, ...
 - 干掉 LaTeX !用BookDown写本书
			
Bookdown是著名R包作者谢益辉开发的,支持采用Rmarkdown (R代码可以运行)或普通markdown编写文档,然后编译成HTML, WORD, PDF, Epub等格式. bookdown ...
 - 【Flask】cbv源码分析 flask模板使用 flask请求与响应 session及源码分析 闪现flash 请求扩展
			
目录 上节回顾 今日内容 1 cbv分析 1.1 源码分析 2 模板 2.1 app.py 2.2 index.html 3 请求与响应 4 session及源码分析 4.1 session的使用 4 ...
 - 透析阿里云视频云「低代码音视频工厂」之能量引擎——vPaaS 视频原生应用开发平台
			
为满足企业用户极速搭建高品质专属音视频业务的需求,阿里云视频云的"低代码音视频工厂"应运而生,但极速而高品质的平台搭建诉求,需要用全新的开发方式才能真正实现,而全新的开发方式背后蕴 ...
 - async await 异步下载 异步代码加锁 lock 异步缓存
			
async await 异步下载 异步代码加锁 lock 异步缓存 FTP异步下载代码: /// <summary> /// 异步下载文件 /// </summary> /// ...