Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者

一、下载地址

官网下载链接

二、Heap Dump

Heap Dump,也叫堆转储文件,是java进程在某个时间内的快照
它在触发快照的时候保存了很多信息:java对象和类信息。通常在写Heap Dump文件前会触发一次Full GC

Heap Dump信息:
Typical information which can be found in heap dumps (once more - depending on the heap dump type) is:

  • All Objects
    Class, fields, primitive values and references
  • All Classes
    Classloader, name, super class, static fields
  • Garbage Collection Roots
    Objects defined to be reachable by the JVM
  • Thread Stacks and Local Variables
    The call-stacks of threads at the moment of the snapshot, and per-frame information about local objects

怎样获取Dump

通过OOM获取

即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,在jvm中添加参数:

-XX:+HeapDumpOnOutOfMemoryError

主动获取

在虚拟机添加参数如下,然后在Ctrl+Break组合键即可获取一份Heap Dump

-XX:+HeapDumpOnCtrlBreak

使用HPROF agent

使用Agent可以在程序执行结束时或受到SIGOUT信号时生成Dump文件
配置在虚拟机的参数如下:

-agentlib:hprof=heap=dump,format=b

jmap获取

jmap可以在cmd里执行,命令如下:

jmap -dump:format=b file=<文件名XX.hprof> <pid>

使用JConsole

Acquire Heap Dump

使用Memory Analyzer Tools的File -> Acquire Heap Dump功能

三、MAT用来做什么

  • 找出内存泄漏的原因
  • 找出重复引用的类和jar
  • 分析集合的使用
  • 分析类加载器

四、MAT使用介绍

4.1 Histogram直方图

Histogram是使用最多的一个,可以列出内存中的对象,对象的个数及其大小

4.1.1 具体信息

具体信息

  1. Class Name : 类名称,java类名
  2. Objects : 类的对象的数量,这个对象被创建了多少个
  3. Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
  4. Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和

4.1.2 Group by packages查看

按包名的形式进行排列

4.1.3 查看GC Roots

  • 将列出该类的实例

在某一项上右键打开菜单选择list objects ->with incoming refs将列出该类的实例

with outgoing references:这个类引用到了哪些类
with incoming references:这个类被哪些类所引用

  • 找到GC Roots

快速找出某个实例没被释放的原因,可以右健Path to GC Roots–>exclue all phantom/weak/soft etc. reference

用这个方法可以快速找到某个对象的GC Root,一个存在GC Root的对象是不会被GC回收掉的

4.2 Leak Suspects

自动分析内存内存泄漏的原因,可以直接定位到Class和代码行数

深色区域被怀疑有内存泄漏,具体点开详情来找到类

4.3 Top Comsumers

通过图型列出最大的Object

4.4 Dominator Tree

列出线程的树结构,及线程下面对象占用内存的空间

Percentage:这个对象占所有对象的百分比,前面这几个对象占10%,可以知道它占内存的大部分,需要详细地进行优化这部分对象,需要看一下这些对象能不能被回收以及它为什么没有被回收
with outgoing references:这个类引用了哪些对象
with incoming references:这个类被哪些对象所引用

dominator_tree与Histogram中中这两个值的区别是:

  • dominator_tree基于实例的角度
  • historgram基于类的角度

在dominator_tree中,会将具体的对象列出来

4.5 thread_overview

详细地展示线程信息

五、分析套路

方法一

  1. 通过thread_overview,按retained head排序,展开线程,从调用栈中找到当前服务的代码
  2. 通过histogram,选择group by package,按retained head排序,找到当前服务的代码

找到最属于自己服务代码中最可疑的堆栈对象后,查询list object --> out comming,查看它里面包括了什么

方法二

直接通过dominator_tree,按retained head排序,然后看最大的线程在持有哪些大对象,还可以右键查看线程详细堆栈信息

六、dump文件

经常服务直接OOM,所以需要自动触发headdump

OOM时自动触发headdump

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/temp/heapdump.hprof

FGC前后做headdump

-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:HeapDumpPath=/app/temp/

【调优工具】MAT内存分析工具相关推荐

  1. Java性能调优工具:MAT内存分析工具,上万字带你彻底了解

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

  2. 发布即巅峰:Java性能调优六大工具:MAT内存分析工具

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

  3. Eclipse MAT 内存分析工具

    Exlipse MAT 是一款强大的 Java 堆内存分析工具,我们可以通过该工具实现对 Java 堆内存的分析. 官网.实现查找内存泄漏以及查看内存消耗的情况. MAT 使用 首先去官网下载对应的软 ...

  4. MAT内存分析工具-独立版安装教程及实战教学

    MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗.使 ...

  5. 高级篇——数据库调优步骤(性能分析工具)

    查看系统性能参数 统计sql的查询成本 last_quer 慢查询日志分析工具 mysqldumpslow 关闭慢查询日志 当调优的时候再开启 平时开着会影响性能 删除慢查询日志 恢复慢查询日志的初始 ...

  6. java堆栈分析工具_JVM内存分析工具使用

    Java 内存堆栈分析.我们在分析现网问题时候,经常会遇到一些问题从日志上无法分析的疑难问题.在我们举足无措的时候,我们可以分析一些JVM内存,来看看问题出在哪里了. 我们经常用到的一工具: 分析栈内 ...

  7. mac下安装 mat内存分析工具

    1. 下载 https://www.eclipse.org/mat/downloads.php 2. 安装 下载完成之后是一个zip压缩包,双击解压,得到一个应用程序 mat右键-显示包内容 进到Co ...

  8. mac下 内存分析工具mat安装,使用mat分析:内存溢出、内存泄漏,结合jstat、jmap等命令的使用

    分析前提: mat的安装详情:mac下安装 mat内存分析工具_MissNull的博客-CSDN博客_mac mat下载                             使用Eclipse M ...

  9. java visualvm 内存_【Java线程与内存分析工具】VisualVM与MAT简明教程

    前言 本文将简要介绍Java线程与内存分析工具VisualVM和MAT的使用,进一步的学习可参考官网或工具帮助(例如MAT:Help -> Welcome -> Tutorials),并在 ...

最新文章

  1. js加载html的head偶尔失效,外部 js 文件偶尔会加载失败
  2. 互联网50年类脑架构技术演化图
  3. MATLAB报错:未定义函数或变量
  4. 如何统一集体的所有人的yum环境(以阿里云为例)
  5. Android社会化分享详解
  6. Docker是传统的应用发布管理的终结者么?
  7. 全日制计算机大专学校有哪些科目,全日制大专报名_实时汇总
  8. 这15个网站,为设计师提供用不完的免费素材
  9. 局域网计算机网卡唯一标识,每块以太网卡都有一个用48个二进位表示的全球唯一的MAC地址,网卡安装在哪台计算机上,其MAC地址就成为该台计算机的 地址。...
  10. linux开机自动执行脚本、运行程序
  11. python小欢喜(二)神奇的小海龟(1) 绕圈子把自己都绕晕了
  12. java华氏温度与摄氏度的互相转换
  13. html网页的主题标签是什么6,HTML标签及标签属性大全(网页制作必备知识)
  14. 我的世界java版高效率刷怪塔_我的世界超高效率刷怪塔制作教程 砍怪砍到手抽筋...
  15. while循环语句初学
  16. 【离散数学】集合与关系
  17. Abaqus子程序Vumat报错Bad material definition
  18. 九、SpringCloud基础微服务结构详解
  19. 世界上谁在乎您一个打工人的想法呢
  20. matlab function_MATLAB处理INCA采集数据(mdf,dat等)一

热门文章

  1. 小红书用户画像分析_电商平台用户画像分析
  2. 学习笔记-写论文修改语法、同义词替换、找专业名词的一些网站
  3. ABB机械手RobotStudio6.08 激活秘钥 和 激活方式
  4. 疫情信息查询微信小程序的实现
  5. matlab显示警告:由于未找到因为输出,无法播放音频
  6. zookeeper的框架学习和使用——Curator的使用
  7. Spark MLlib学习笔记:构建一个机器学习工作流
  8. Radeon 680M参数 680m核显相当于什么显卡 680m集成显卡什么水平
  9. 成本控制:自建和租用企业邮箱哪个更划算?
  10. 基于Android的相关毕业设计和论文