Mat使用详解

简介: Mat使用详解

背景

笔记中躺了很久的文章,今天用到Mat时发现之前写的内容还算清晰,分享出来;
如下所举例使用的dump文件是针对之前使用的ignite库溢出时的dump文件;关于ignite的概念此处不再叙述,本篇文章重点则在于Mat即可

Mat的作用

MAT是Memory Analyzer tool的缩写,是一种快速,功能丰富的Java堆分析工具,能帮助你查找内存泄漏和减少内存消耗。很多情况下,我们需要处理测试提供的hprof文件,分析内存相关问题,那么MAT也绝对是不二之选。 Eclipse可以下载插件结合使用,也可以作为一个独立分析工具使用;下载地址: https://pan.baidu.com/s/1NDUR0E3WGrktm1qwoZHWfg
提取码:agxr ;不用谢,雷锋

Mat的使用步骤

打开Mat后File>OpenHeapDump打开一个对应的dump文件后,此时对应的打开后结果如图所示:

默认情况下打开该dump文件后,直接展示的就是一个Overview(概览)的页签,其中可以看到上面标注为(1,2)的地方所对应的图标与Overview页签中所对应的部分图标是相似的;如果你不小心关掉了Overview的页签,那么直接单击当前dump页签第一行导航栏的第一个 I字的图标即可,同理,如果此时想要打开Histogram,那么在不打开Overview的情况下,直接点击第一行导航栏的第二个图标即可;......

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:

    • Component Report:组件报告,分析属于公共根包或类加载器的对象;

    上述所有被标注加粗的部分,是内存溢出dump分析时较为常用的功能点也是下面主要讲解的内容。

原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94

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的类信息;

Dominator Tree

以占用总内存的百分比的方式来列举出所有的实例对象,可以用来发现大内存对象;

如上图所示:可以看到ConcurrentHashMap@0x60191cfa8这个对象占据了98.92%的堆大小,所以基本就可以断定,当前项目之所以会down机的主要原因是,ConcurrentHashMap溢出所导致的问题;

那么当我们需要查看,当前该ConcurrentHashMap@0x60191cfa8对象都引用了那些数据,以及当前该对象是被那几个对象所引用的,如何查看?

鼠标在当前所要查看的对象右键,点击List Objects可以看到分别提供了:with outgoing references(查看当前该对象的所有的引用信息) 和 with incoming references(查看当前该对象是被那几个对象所引用的) ;

原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94

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 (按类列出所有的累积对象)

原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94

Overview功能说明结尾

通过上述的解释应该对当前Overview下的功能使用已经有了一个大概的了解,需要注意的是,Histogram 以及Dominator Tree时所主要提及的Shallow Size以及Retained Size以及在所列出的对象上右键查看引用关系,GCROOTS,以及左上角所展示的属性明细等功能 是适用于所有的功能模块的,后续不再赘述;

一级导航栏功能说明

查看完上述关于Overview中的功能说明后,此处再来看一下Overview中不包含的一些功能

Thread_Overview

如下图所示,点击一级导航栏的第5个图标,可以用来查看当前进程dump时的所有线程的堆栈信息,通过分析下面所对应的堆栈信息,可以很快速的定位到对应的线程所执行的方法等层级关系,以此来定位对应的异常问题;

OQL

用于查询Java堆的类SQL查询语言

Heap Dump Overview

点击一级导航栏的第6个图标的下拉框下的 Heap Dump Overview,可以查看全局的内存占用信息

Find Object by address

查看指定内存地址所对应的对象信息;

常见溢出的几个场景

1、线程所引用对象溢出
2、静态属性对象溢出

线程栈所引用对象溢出的场景,如下:

Mat各功能内还有很多小的子功能,使用过程中可逐步尝试,此处不再赘述

原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94

相关文章
|
1月前
|
人工智能 IDE 安全
一文读懂阿里云 Qoder 智能体工作台:Agent Harness 驾驭系统、双模式工作流、业务场景详解
升级之后的Qoder,核心工作范式发生本质改变。传统AI工具的逻辑是用户产出指令,模型输出片段结果,剩下大量集成调试交由人来完成;而Qoder的设计思路,把用户角色转变为任务委派者与结果验收者,智能体负责完整执行链路。底层核心支撑为Agent Harness智能体驾驭系统,完整覆盖“辅助编程—协同编程—自主编程”三层能力。用户既可以和智能体对话协同,共同做需求梳理、编码调整;也可以直接把完整复杂任务交给自主智能体,由Agent端到端执行,不需要人工频繁介入干预。
433 2
|
2月前
|
SQL 人工智能 测试技术
SDD 工程法实战:用 AI 按规格开发一个真实项目
源码:https://github.com/NyaRu-Kiss/SDD-Research_AgentSDD(Spec-Driven Development,规格驱动开发)是一种先写清规则、需求和技术设计,再让 AI 执行代码的开发方法。它适合 AI 辅助开发,因为 AI 的执行速度…
|
1月前
|
人工智能 前端开发 架构师
Qoder Agent SDK 专场,把 Qoder 的 Harness 装进你的产品
Qoder Agent SDK集成专场,邀请Qoder 解决方案专家和阿里前端技术专家详解如何将成熟Agent执行内核以SDK形式快速嵌入自有产品。涵盖SDK开放方案、PAW业务能力落地实践及深度案例,助力产品负责人、架构师高效决策“自研 or 集成”。9月8日16:00直播!
230 0
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到 OutOfMemoryError(OOM)表示内存资源不足。常见OOM情况包括:1) **Java堆空间不足**:内存被大量对象占用且未及时回收,或内存泄漏;解决方法包括调整JVM堆内存大小、优化代码及修复内存泄漏。2) **线程栈空间不足**:单线程栈帧过大或频繁创建线程;可通过优化代码或调整-Xss参数解决。3) **方法区溢出**:运行时生成大量类导致方法区满载;需调整元空间大小或优化类加载机制。4) **本机内存不足**:JNI调用或内存泄漏引起;需检查并优化本机代码。5) **GC造成的内存不足**:频繁GC但效果不佳;需优化JVM参数、代码及垃圾回收器
1409 7
常见java OOM异常分析排查思路分析
|
Java Android开发
MAT如何使用?
MAT如何使用?
1727 4
|
Java 中间件 调度
SpringBoot整合XXL-JOB【03】- 执行器的使用
本文介绍了如何将调度中心与项目结合,通过配置“执行器”实现定时任务控制。首先新建SpringBoot项目并引入依赖,接着配置xxl-job相关参数,如调度中心地址、执行器名称等。然后通过Java代码将执行器注册为Spring Bean,并声明测试方法使用`@XxlJob`注解。最后,在调度中心配置并启动定时任务,验证任务是否按预期执行。通过这些步骤,读者可以掌握Xxl-Job的基本使用,专注于业务逻辑的编写而无需关心定时器本身的实现。
5656 10
SpringBoot整合XXL-JOB【03】-  执行器的使用
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
安全 IDE Java
使用MapStruct和Lombok简化代码
使用MapStruct和Lombok简化代码
760 2