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
Mat使用详解的更多相关文章
- Mat的详解
[转]OpenCV中Mat的详解 每次碰到Mat都得反复查具体的用法,网上的基础讲解不多,难得看到一篇,赶快转来收藏~ 原文地址:http://www.opencvchina.com/thread-1 ...
- OpenCV参考手册之Mat类详解
OpenCV参考手册之Mat类详解(一) OpenCV参考手册之Mat类详解(二) OpenCV参考手册之Mat类详解(三)
- opencv数据结构-MAT结构详解
1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...
- OpenCV中Mat的详解
每次碰到Mat都得反复查具体的用法,网上的基础讲解不多,难得看到一篇,赶快转来收藏~ 原文地址:http://www.opencvchina.com/thread-1039-1-1.html 目标 我 ...
- [OpenCV]Mat类详解
http://blog.csdn.net/yang_xian521/article/details/7107786 Preface Mat:Matrix Mat类可以被看做是opencv中C++版本的 ...
- imagenet-vgg-verydeep-19.mat格式详解
.mat是matlab生成的文件.用matlab打开文件imagenet-vgg-verydeep-19.mat可以帮助理解其结构.matlab代码如下: a = open('D:\imagenet- ...
- OpenCV-Mat结构详解
前面博客中Mat函数谈到一些理解,但是理解的比较浅显,下面谈谈通道,行列等意义: Mat的常见属性 opencv中type类型· CV_<bit_depth>(S|U|F)C<num ...
- CvMat、Mat、IplImage之间的转换详解及实例
见原博客:http://blog.sina.com.cn/s/blog_74a459380101obhm.html OpenCV学习之CvMat的用法详解及实例 CvMat是OpenCV比较基础的函数 ...
- Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...
随机推荐
- python中使用with操作文件,为什么不需要手动关闭?
python中的with关键字,它是用来启动一个对象的上下文管理器的.它的原理是,当我们使用with去通过open打开文件的时候,它会触发文件对象的上下文管理器, 当with中的代码结束完成之后,去自 ...
- 4G DTU的使用方法和应用领域
4G DTU是一种数据传输单元,通俗理解就是,用来传输数据的一种硬件.既然是用来传输数据的,那就能将它视为一个管道,也就是说,指令同过它传给设备,而管道是不对这些指令做出响应的. 4G DTU如何使用 ...
- .NET CORE QuartzJob定时任务+Windows/Linux部署
前言 以前总结过一篇基于Quartz+Topshelf+.netcore实现定时任务Windows服务 https://www.cnblogs.com/gt1987/p/11806053.html.回 ...
- 5G应用的实时决策
背景概述 尽管近几年很多供应商在不断重申着他们对VoltDB持续输出的专业认可,VoltDB也随着技术发展在不断增加一些流行技术词汇,但是真正让大家了解某个技术产品持续演进的特性,单单依靠增加几个技术 ...
- [Luogu P3626] [APIO2009] 会议中心
题面 传送门:https://www.luogu.org/problemnew/show/P3626 Solution 如果题目只要求求出第一问,那这题显然就是大水题. 但是加上第二问的话...... ...
- C语言100题集合004-统计各个年龄阶段的人数
系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...
- 教你如何 分析 Android ANR 问题
ANR介绍 ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch.Broadcast.Service) ...
- Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题
背景:公司网站业务在做海外营销网站,为了配合营销工作,前端总要在各种地方添加各种社媒订阅(摊手.jpg):最近遇到的是在弹窗内展示公司的Youtube账号的订阅按钮. 理想:我想使用的例子是这样的: ...
- youtube-dl 源码看看,例子是下载网页
1, 跑起来 下载 youtube-dl, 配合 launch.json, # 本文中 himala 是代指,具体见文末的 github repo "configurations" ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...