目录

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. 数据库“意外失联”?华为云DRS异地多活灾备为您支招

    [摘要] 为了更好地提供灾备保护,华为云数据库在"同城两中心"的基础上提出了异地保护的方案,华为云数据复制服务DRS推出了异地多活灾备,即"两地四中心". 在D ...

  2. 新一代云原生可观测平台之CCE服务监控篇

    本文分享自华为云社区<新一代云原生可观测平台之CCE服务监控篇>,作者: 云容器大未来. 在云原生容器化浪潮的当下,监控是确保业务稳定性最受关注的问题之一.那么,华为云CCE容器服务又是如 ...

  3. 华为云HBase冷热分离最佳实践

    本文分享自华为云社区<华为云HBase 冷热分离最佳实践>,作者:pippo. HBase介绍 HBase是Hadoop Database的简称,是建立在Hadoop文件系统之上的分布式面 ...

  4. WxJava for Solon - 咱也不知道为啥要写

    ? 应 Solon 技术交流群里小伙伴的要求,我分享下在 Solon 中使用 WxJava 的经验.类库. 具体实现 提供统一的 Yaml 配置 package cn.edu.hnuahe.mount ...

  5. 【Git使用】代码拉取及用户名初始化

    代码拉取及用户名初始化

  6. 自用 | Rust 基础学习资料

    Rust语言圣经:Github,GitBook Rustt,RusttT 翻译小组的官方仓库,这里有国外优秀的技术文章.学习教程.新闻资讯的高质量翻译. Rust语言周刊,每周五发布,精选过去一周的技 ...

  7. #2051:Bitset(进制转化)

    Problem Description Give you a number on base ten,you should output it on base two.(0 < n < 10 ...

  8. mock.js使用

    前后端联调必备技术之Mock讲解 什么是Mock数据? 处于开发环境模拟接口返回的数据(用于开发状态后端还没给接口) 不会影响生产环境,只是方便我们还没与后端交互时,不阻塞我们开发流程 mock数据好 ...

  9. Telegraf 使用小结

    转载请注明出处: 1.简介: Telegraf是一个开源的代理程序,用于收集.处理.汇总和发送指标数据.它可以与不同的数据存储和可视化工具(如InfluxDB.Elasticsearch.Grafan ...

  10. 比Nginx更好用的Gateway!

    比Nginx更好用的Gateway! Token新开源Gateway,使用yarp实现的一个反向代理,支持界面操作动态添加集群添加路由绑定,并且支持动态添加域名绑定https证书,超强yarp+Fre ...