内存分析器 (MAT)
1. 内存分析器 (MAT)
1.1 MAT介绍
MAT是Memory Analyzer tool的缩写。指分析工具。
1.2 MAT作用
Eclipse Memory Analyzer 是一种快速且功能丰富的Java 堆分析器,可帮助您发现内存泄漏并减少内存消耗。
使用内存分析器分析具有数亿个对象的生产堆转储,快速计算对象的保留大小,查看谁在阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑人。
2. MAT的安装
2.1 下载安装包
下载地址:https://www.eclipse.org/mat/
选择版本(备注:最新版本1.12.0需要JDK11及以上,如果本地JDK环境是Java8选择1.10.0版本)
进来直接选择DownLod会被国内的防火墙给拦截,需要选择国内镜像,点击Select Another Mirror选择China开头的镜像即可下载.
2.2 配置内存
将加载下来的zip安装包解压后,找到 MemoryAnalyzer.ini 修改内存(默认配置的内存较小,一般dump文件都比较大,不改大会导致内存溢出)
配置 -Xmx
3. MAT的使用
Mat的使用步骤
打开Mat后File>OpenHeapDump打开一个对应的dump文件后,此时对应的打开后结果如图所示:
默认情况下打开该dump文件后,直接展示的就是一个Overview(概览)的页签,其中可以看到上面标注为(1,2)的地方所对应的图标与Overview页签中所对应的部分图标是相似的;如果你不小心关掉了Overview的页签,那么直接单击当前dump页签第一行导航栏的第一个 I字的图标即可,同理,如果此时想要打开Histogram,那么在不打开Overview的情况下,直接点击第一行导航栏的第二个图标即可;
4. Overview下功能解释
Overview页签下分别包含了:Actions,Reports,Step By Step 三大块功能;每一块功能下的子集所对应的作用分别是:
- Actions:
- Histogram 列出每个类所对应的对象个数,以及所占用的内存大小;
- Dominator Tree 以占用总内存的百分比的方式来列举出所有的实例对象,注意这个地方是直接列举出的对应的对象而不是类,这个视图是用来发现大内存对象的
- Top Consumers:按照类和包分组的方式展示出占用内存最大的一个对象
- Duplicate Classes:检测由多个类加载器所加载的类信息(用来查找重复的类)
- Reports:
- Leak Suspects:通过MAT自动分析当前内存泄露的主要原因
- Top Components:Top组件,列出大于总堆1%的组件的报告
- Step By Step:
上述所有被标注加粗的部分,是内存溢出dump分析时较为常用的功能点也是下面主要讲解的内容。- Component Report:组件报告,分析属于公共根包或类加载器的对象;
4.1 Histogram
通过Histogram 列出每个类所对应的对象个数,以及所占用的内存大小;
此处选中一个ClassName单击后,通过左上角Inspector可以看到当前类的回收情况,内存地址,等
补充解释:
- 字段一:表示当前类所对应的对象数量
- 字段二:Shallow Size是对象本身占据的内存的大小,不包含其引用的对象。对于常规对象(非数组)的Shallow Size由其成员变量的数量和类型来定,而数组的ShallowSize由数组类型和数组长度来决定,它为数组元素大小的总和;
- 字段三:Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C,C就是间接引用) ,并且排除被GC Roots直接或者间接引用的对象;
关于红框内的Statics,Attributes,Classhierarchy,Value则分别表示当前类的静态变量,属性,当前类的层次结构图,以及当前类所对应的值Value;
注意:当前Histogram的列属性:ClassName,Objects,ShallowHeap,RetainedHeap这几个列属性下面都是有提供一个输入框,通过该输入框可以进行相关类的检索,比如:在ClassName下输入一个正则.*quark.*那么则获取到所有包路径为quark的类信息;
4.2 Dominator Tree
以占用总内存的百分比的方式来列举出所有的实例对象,可以用来发现大内存对象;
如上图所示:可以看到ConcurrentHashMap@0x60191cfa8这个对象占据了98.92%的堆大小,所以基本就可以断定,当前项目之所以会down机的主要原因是,ConcurrentHashMap溢出所导致的问题;
那么当我们需要查看,当前该ConcurrentHashMap@0x60191cfa8对象都引用了那些数据,以及当前该对象是被那几个对象所引用的,如何查看?
鼠标在当前所要查看的对象右键,点击List Objects可以看到分别提供了:with outgoing references(查看当前该对象的所有的引用信息) 和 with incoming references(查看当前该对象是被那几个对象所引用的) ;
4.3 Leak Suspects
通过MAT自动分析当前内存泄露的主要原因
可以看到,当前MAT所给出内存泄露的主要原因是:当前实例java.util.concurrent.ConcurrentHashMap被加载自system class loader,共占用了 98.92%的堆内存,这个实例被引用自org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl并且这个CacheObjectBinaryProcessorImpl这个对象是加载自LaunchedURLClassLoader这个类加载器;
并且还给出了所对应的主要关键词是:
java.util.concurrent.ConcurrentHashMap$Node[]
java.util.concurrent.ConcurrentHashMap
org.springframework.boot.loader.LaunchedURLClassLoader @ 0x6000a6860
基本上可以说是很详细了,一语中的,如果想要查看明细,可以直接点击detail,里面有更详细的说明,如下图所示:
上图分别说明了到该内存泄漏的对象的最快路径,也就是列出了当前ConcurrentHashMapConcurrentHashMap@0x60191cfa8这个对象所对应的被引用关系:可以看到当前引起内存泄漏的ConcurrentHashMap被CacheObjectBinaryProcessorImpl@0x60191cea8这个对象的metadataLocCache这个属性所引用,而CacheObjectBinaryProcessorImpl这个对象又被GridKernalContextImpl @ 0x601821bf8这个对象的cacheObjeProc这个属性所引用,以此递推;
除此之外,还有以下三个被隐藏的信息,点击即可查看明细:
Accumulated Objects in Dominator Tree (主控树中的累积对象),Accumulated Objects by Class in Dominator Tree(主控树中的按类累积对象 ,All Accumulated Objects by Class (按类列出所有的累积对象)
Overview功能总结:
通过上述的解释应该对当前Overview下的功能使用已经有了一个大概的了解,需要注意的是,Histogram 以及Dominator Tree时所主要提及的Shallow Size以及Retained Size以及在所列出的对象上右键查看引用关系,GCROOTS,以及左上角所展示的属性明细等功能 是适用于所有的功能模块的。
5. 一级导航栏功能说明
查看完上述关于Overview中的功能说明后,此处再来看一下Overview中不包含的一些功能:
5.1 Thread_Overview
如下图所示,点击一级导航栏的第5个图标,可以用来查看当前进程dump时的所有线程的堆栈信息,通过分析下面所对应的堆栈信息,可以很快速的定位到对应的线程所执行的方法等层级关系,以此来定位对应的异常问题;
5.2 OQL
用于查询Java堆的类SQL查询语言
5.3 Heap Dump Overview
点击一级导航栏的第6个图标的下拉框下的 Heap Dump Overview,可以查看全局的内存占用信息
5.4 Find Object by address
查看指定内存地址所对应的对象信息:
6. 常见溢出的几个场景
- 线程所引用对象溢出
- 静态属性对象溢出
线程栈所引用对象溢出的场景,如下图:
内存分析器 (MAT)的更多相关文章
- Android Developer:内存分析器
Heap Viewer,Memory Monitor和Allocation Tracker是用来可视化你的app使用内存的补充工具. 使用Memory Monitor Tool来发现是否有不好的内存回 ...
- java 内存调试 mat
https://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/ http://www.open-open.com/lib/view/ope ...
- Eclipse MAT内存分析工具(Memory Analyzer Tool)
MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...
- 性能优化 Profiler MAT 内存泄漏 堆转储 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【转】Eclipse MAT内存分析工具(Memory Analyzer Tool)
Eclipse MAT内存分析工具(Memory Analyzer Tool) MAT内存分析工具# MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找 ...
- Visual Studio的.NET内存分配分析器解析
Visual Studio 2012拥有丰富的有价值的功能,以至于我听到开发者反馈的需要的新功能新版本已经有了.另外,我听到开发人员询问具体的功能的某个特性,实际上他真正需要的是另外一个功能点. 上面 ...
- Android防止内存泄漏以及MAT的使用
Android发生内存泄漏最普遍的一种情况就是长期保持对Context,特别是Activity的引用,使得Activity无法被销毁.这也就意味着Activity中所有的成员变量也没办法销毁.本文仅介 ...
- 【转】如何使用MAT分析内存泄漏
原文链接:http://www.lightskystreet.com/2015/09/01/mat_usage/ MAT - Memory Analyzer Tool 使用进阶 Sep 1, 2015 ...
- OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式
以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个二维数组,整幅图像组成一个三维数组,即: Mat.dat ...
随机推荐
- Water 2.6.1 发布,一站式服务治理平台
Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...
- jmeter并发设置的原理
目录 简介 广义并发 绝对并发 简介 性能测试过程中是否需要进行同步定时器的设置,需要根据实际情况来考虑. 举个栗子来讲是我们的双十一秒杀活动,这时候就必须实现请求数量达到一定数量后同时向服务 ...
- vue-mobile-template 前端开源框架
开源项目的由来 某天因公司业务需求,想寻找一款H5移动端的模板进行二次开发.但搜遍整个HUB都没法找到合适的空模板进行二次开发,所以心血来潮,于是有了 vue-mobile-template . 介绍 ...
- 在 ESXi 主机上关闭无响应的虚拟机电源
使用 ESXi 命令行 使用 SSH 以 root 身份登录到 ESXi. 通过运行以下命令获取所有已注册虚拟机的列表,由其 VMID 和显示名称标识: vim-cmd vmsvc/get ...
- Bugku练习题---MISC---蜜雪冰城~
Bugku练习题---MISC---蜜雪冰城~ flag:flag{1251_521_m1xueb1n9chen9ti@nm1mi} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现有好几个文件 ...
- Java-GUI编程之Swing组件
目录 为组件设置边框 使用JToolBar创建工具条 JColorChooser和JFileChooser JColorChooser JFileChooser JOptionPane 基本概述 四种 ...
- ajax 请求登录超时跳转登录页解决方法
在Filter里判断是否登录,如果未登录返回401状态 public class SelfOnlyAttribute : ActionFilterAttribute { public override ...
- 个人NuGet服务搭建,BaGet保姆及部署教程
前言 应该或许大概每个公司都会有自己的NuGet包仓库吧. 不会吧!不会吧!不会吧!不会还没有自己的仓NuGet仓库吧! 开个玩笑,虽然我觉得有没有无所谓,但是为了这篇博客它必须有所谓. 在工具的选择 ...
- lnav-日志查看器
lnav是一个基于控制台的高级lnav是一个基于控制台的高级日志文件查看器(浏览器). lnav支持日志高亮显示内容以及查看压缩的日志文件,而且它可以使用较小的内存实时查看较大的日志文件.日志文件查看 ...
- webpack基础知识介绍
1.开发模式 开发模式顾名思义就是我们开发代码时使用的模式 webpack默认只处理js文件,对样式是没办法处理的.因此要处理css资源需要引入CSS-loader 处理CSS资源 如果要使用 css ...