[转帖]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确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...
随机推荐
- Python图像处理丨带你掌握图像几何变换
摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实. 本文分享自华为云社区<[Python图像处理] 十二.图像几何变换之图像仿射变换.图像透视变换和图像校 ...
- WebKit三件套(2):WebKit之JavaScriptCore/V8
WebKit作为一个浏览器引擎,其中Javascript实现包括JavaScriptCore和V8,为了能更全面的了解WebKit,我们需要深入的了解Javascript实现的基本原理.其在WebKi ...
- DataLeap的全链路智能监控报警实践(三): 系统实现
系统实现 整体架构 基线管理模块:负责基线创建.更新.删除等操作,管理基线元信息,包括保障任务,承诺时间,余量及报警配置等): 基线实例生成:系统每天定时触发生成基线实例,生成实例的同时根据保障任务, ...
- 【Vue】大总结
目录 vue大回顾 模板语法处理xss攻击 Vue单页面组件 ts泛型 sass\less\css的区别 ...toRef() defineEmits 练习 根据分数显示颜色 vue大回顾 1 前端发 ...
- BP 供应商创建与修改
1业务场景 BP中,供应商和客户的创建发生了很大变化,之前的BAPI无法使用,本文档采用新的方法创建供应商. 2创建 2.1业务伙伴 2.2添加BP角色 2.3维护银行数据 2.4维护类别税号数据 2 ...
- 这应该是java最好用的orm之一了
这应该是java最好用的orm之一了 说起orm大家肯定都不会陌生,作者是一个.net菜鸟.并且是在.net繁荣的orm圈子下成长的,所以这次给大家带来的是媲美efcore,freesql,sqlsu ...
- MyBatis-Plus (SpringBoot2 版)看这篇就足够了,一发入魂
1.了解 Mybatis-plus 1.1.Mybatis-Plus 介绍 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简 ...
- Codeforces Round #728 (Div. 2) A~C 补题记录
比赛链接:Here 1541A. Pretty Permutations 给定 \(1,2,3,4,...n\) 序列,让每一个数字都不处于原来的位置,但总的移动距离要最小 \(n\) 为偶数的情况 ...
- CompletableFuture 测试类
package com.example.apidemo.completableFutrue; import java.util.Random; import java.util.concurrent. ...
- 基于 HTML5 WebGL + WebVR 的 3D 虚拟现实可视化培训系统
前言 2019 年 VR, AR, XR, 5G, 工业互联网等名词频繁出现在我们的视野中,信息的分享与虚实的结合已经成为大势所趋,5G 是新一代信息通信技术升级的重要方向,工业互联网是制造业转型升级 ...