目录

1 模拟内存溢出程序

1.1 jvm配置

1.2 测试代码

2 MAT工具进行内存分析

2.1 大纲介绍

2.2 Histogram视图介绍

2.3 Leak Suspects视图介绍

2.4 Dominator Tree


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 测试代码


  1. private Executor executor = Executors.newFixedThreadPool(5);
  2. private Random random = new Random();
  3. @Test
  4. public void oomTest() throws InterruptedException {
  5.     while (true) {
  6.         Employee employee = new Employee(random.nextInt(100), UUID.randomUUID().toString(),
  7.                 random.nextInt(100), new BigDecimal(random.nextDouble()));
  8.         executor.execute(() -> execute(employee));
  9.     }
  10. }
  11. private void execute(Employee employee) {
  12.     try {
  13.         System.out.println(employee);
  14.         Thread.sleep(5000);
  15.     } catch (InterruptedException e) {
  16.         e.printStackTrace();
  17.     }
  18. }

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还有一些其他的分析报告,这里就不一一列举了,常用的就这些,平时工作中定位问题基本上已经足够了。

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览96637 人正在系统学习中

[转帖]jvm学习三-MAT内存分析工具的使用的更多相关文章

  1. Eclipse MAT内存分析工具(Memory Analyzer Tool)

    MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...

  2. 【转】Eclipse MAT内存分析工具(Memory Analyzer Tool)

    Eclipse MAT内存分析工具(Memory Analyzer Tool) MAT内存分析工具# MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找 ...

  3. MAT内存分析工具安装指南(MAT)

    https://blog.csdn.net/mahl1990/article/details/79298616

  4. Android内存优化(三)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...

  5. 【Java线程与内存分析工具】VisualVM与MAT简明教程

    目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...

  6. Android内存分析工具DDMS heap + MAT 安装和使用

    一  Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲   MAT介绍:     Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...

  7. JVM学习01:内存结构

    JVM学习01:内存结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 内存结构知识要点Xmind梳理 案例分析 分析1 package com.h ...

  8. Java内存分析工具MAT

    MAT是一个强大的内存分析工具,可以快捷.有效地帮助我们找到内存泄露,减少内存消耗分析工具.内存中堆的使用情况是应用性能监测的重点,而对于堆的快照,可以dump出来进一步分析,总的来说,一般我们对于堆 ...

  9. MAT内存分析

    先下载 http://www.eclipse.org/mat/downloads.php 配置环境参数 分析一个堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,建议分配给 ...

  10. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

随机推荐

  1. 聊聊游戏业务怎么用高斯Redis

    摘要:其实游戏客户对数据库的诉求是很明确的,数据库应当"放心存放心用". 本文分享自华为云社区<华为云GaussDB(for Redis)揭秘第27期:聊聊游戏业务怎么用高斯 ...

  2. 华为云GaussDB(for Influx)揭密第六期:数据分级存储

    摘要:GaussDB(for Influx)通过冷热数据存储分离,在提供海量数据高性能存储的同时可节省85%的存储成本,高效满足时序应用各种场景. 本文分享自华为云社区<华为云GaussDB(f ...

  3. 高颜值开源数据可视化工具——Superset 2.0正式发布!

    ​ Superset终于迎来了又一个重大的版本更新.使用superset已经近三年的时间了,其为我们提供了数据可视化的解决方案.也成为了最好的商用BI的替代方案. ​ 在Github上本次更新已经发布 ...

  4. SBOM:缓解软件供应链风险的关键

    软件包含大量且范围广泛的组件.部分和相互依赖关系.需要有效缓解与使用软件相关的安全风险:需要遵守与组件相关的许可证.通过第三方代码(包括开源软件 (OSS))了解产品中所有项目的出处至关重要,无论这些 ...

  5. 火山引擎 ByteHouse:如何提升 18000 节点的 ClickHouse 可用性?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 ClickHouse 是业内被广泛使用的 OLAP 引擎.当集群规模过大时,ClickHouse 则面临使用局限性 ...

  6. 最高提升10倍性能!揭秘火山引擎ByteHouse查询优化器实现方案

     更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   作为企业级数据库的核心组件之一,查询优化器的地位不可忽视.对于众多依赖数据分析的现代企业来说,一个强大且完善 ...

  7. Dom4j 保存XML HL7-V3

    dom4j selectNodes 取不到值 因为XML带有命名空间 HL7 Dom4j 保存XML String xmlPath = "D:\\BS004.xml"; Strin ...

  8. Python办公自动化_Excel篇

    Python办公自动化_Excel篇 库名 作用 xlrd 从excel中读取数据,支持xls,xlsx xlwt 从excel进行修改操作,不支持对xlsx格式的修改 xlutils 在xlrd和x ...

  9. pip 的高阶玩法

    pip 的高阶玩法 pip 应该是大家最熟悉的 Python 包安装与管理工具了,但是除了pip install 这个最常用的命令,还有很多有用的玩法.这里就介绍几个我平时会用到的,希望对大家有所帮助 ...

  10. 2014年第五届蓝桥杯【C++省赛B组】

    第一题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提 ...