目录

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. Proxy下的Prepare透传,让GaussDB(for MySQL)更稳固,性能更卓越

    本文分享自华为云社区<Proxy下的Prepare透传,让GaussDB(for MySQL)更稳固,性能更卓越>,作者: GaussDB 数据库 . 1.引言 在很多业务场景下,数据库应 ...

  2. BugBuilder: 高质量大规模缺陷库自动构建方法

    摘要:本文提出并开发了高质量大规模缺陷库全自动构建方法BugBuilder,自动从版本控制系统中的人为编写的补丁中提取完整且精准的缺陷修复补丁. 本文分享自华为云社区<BugBuilder: 高 ...

  3. 云小课 | 玩转HiLens Studio之快速订购HiLens Studio版本

    摘要:华为HiLens是端云协同多模态AI开发应用平台,提供给开发者的多语言类集成开发环境HiLens Studio,开发者可以在HiLens Studio 中编写和调试技能代码. 本文分享自华为云社 ...

  4. 带你上手全新版本的Webpack 5

    摘要:webpack5快速入门,船新版本,建议收藏 本文分享自华为云社区<webpack5快速入门,船新版本,建议收藏>,作者:北极光之夜.. 一. 快速上手 1.1 Webpack功能: ...

  5. Cesium笔记(3):基本控件简介—ImageryProvider地图瓦片地图配

    cesiumjs中可定制多种图层,可以使用互联网上很多地图提供商的图层数据,也可以使用自己的地图数据.Cesium支持多种标准化格式的GIS瓦片服务,可以把栅格图层绘制到地球的表面--cesiumjs ...

  6. 下一代 SCA:流水线成分分析

    软件成分分析(SCA)是检测开源库等依赖项中漏洞的重要工具.随着现代应用程序的组成从以自定义代码为主的转变为高达70-90%的开源,管理来自第三方的依赖项的漏洞比以往任何时候的重要性都高出许多.然而现 ...

  7. PS CJ37/CJ38 增加和返回预算

    一.预算补充CJ37/预算返回CJ38 二.补充预算CJ37,点击保存 预算返回CJ38,点击保存 三.代码示例 预算补充代码 "------------------------------ ...

  8. 通过 Homebrew 在 Mac OS X 上安装和配置 Redis

    通过使用 Homebrew,可以大大降低在 Mac OS X 上设置和配置开发环境的成本. 让我们安装 Redis. $ brew install redis 安装后,我们将看到一些有关配置注意事项的 ...

  9. Live Server插件打开浏览器时:该网页无法正常运作,127.0.0.1未发送任何数据的问题解决

    一.问题复现 今天使用Vs Code写HTML代码时,使用Live Server打开预览时,发现浏览器显示"该网页无法正常运作,127.0.0.1未发送任何数据"的问题. 二.解决 ...

  10. vue学习笔记 十七、父子组件 ---> 子组件传值

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...