VIA:
今天线上一个应用的持久区满了,一直没有下来,导致一些服务不可用,就用jmap当出内存快照后,用MAT分析内存的基本信息,发现很多地方不会用。找了些资料记录在下来。
1.引用
- Strong reference : 就是我们new出来的对象,但是还是被持有的应用,垃圾回收时不会回收这个应用
- soft reference : 我们new出来的对象,但是已经不被具体对象持有,常见的就是缓存中的对象引用,垃圾回收在内存还够的时候不会回收该部分内存信息,只有在内存不够时才会回收这块引用的对象
- weak reference : 当对象不在有强引用时候,垃圾回收时立刻回收。
- Phantom reference : 不会在内存中出现,因为它一般是同ReferenceQueue一起出现,来跟踪对象是否还是保持强引用。
2.术语
shallow size:对象自身中有的内存大小
retained size:对象自身大小 + 该对象直接或是间接引用对象的shallow size
GC Roots:所有的对象引用refer chains的起点。
以上左图中以object1来说,单独一个object1大小就是shallow size,object1及所有蓝色对象就是该对象直接或是间接引用的就是retained size。
同理右图中object4还被gc roots引用到,那么retained size就不包含这个。
3.实例
3.1导入一个内存文件后,用MAT打开,具体如下图所表示
3.2 details:一些基本信息
Size: 153.7 MB Classes: 331 Objects: 4.1m Class Loader: 3 Unreachable Objects Histogram
3.3 biggest object by retained size:显示在内存较大的对象信息
list objects -- with outgoing references : 查看这个对象持有的外部对象引用。
list objects -- with incoming references : 查看这个对象被哪些外部对象引用。
show objects by class -- with outgoing references :查看这个对象类型持有的外部对象引用
show objects by class -- with incoming references :查看这个对象类型被哪些外部对象引用
paths to gc root : 显示不同类型引用(上文中提到的Strong ,soft,weak )到跟节点的路径。
merge shorest path to gc root : 合并最短路径到root节点,这个具体没试过。
java basics:
-- classloader 该对象对应的classloader信息 。
-- thread details :线程信息
-- thread stacks :线程堆栈
-- find String : 在这个对象中查询需要的字符串(还不确定,需要再搞下)
-- group by : 根据某个字段统计出现的个数
java collections:这个暂时没研究,以后再搞。
leak Identification -- top consumers :几个大消耗内存的对象
3.4 可用操作
actions:列出每个类型的实例数及大小 。
donimator tree :列出所有对象在整个内存对象中所占百分比。比较有用。
Top Consumers: 根据类名和包名列出开销最大的对象。
Duplicate Classes: 查找出在不同classloader中加载的相同类。
step by step 方式
MAP提供了两种分析方式:
1.查找内存泄漏的方式分析内存
2.通过组件方式分析内存主要从;空对象,重复对象加载等方面。
这个在第一次加载内存文件,或者可以通过
总结:
1.首先看retained size最大的那些数据,一般看内存都是想解决内存泄漏问题,可以通过Top Consumers或者是donimator tree等actions。
2.找到最大的数据后,通过list objects -- with outgoing references 查看具体持有了哪些对象,或者通过java basics -- classloader 。查看这个是因为我们这次因为perm区满了,需要查看这个数据。到底还是哪些classloader加载了数据。
tips:
持久区中存放的数据:
类信息,方法信息,常量池,静态变量,对于加载自己的classloader引用、interned strings(字符串驻留)
相关推荐
图文并茂,具体实例的形式说明内存泄露分析工具MAT的具体使用方法
MAT工具使用说明.docx MAT(Memory Analyzer Tool)工具入门 一MAT简介 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少...
MAT,分析堆dump文件的一个工具,结合Eclipse使用,因为工具使用都是英文,不方便操作,此pdf详细介绍功能使用,
使用MAT分析Java堆快照,可以快速计算出对象的保留大小(Retained Sizes),查找到阻止对象被回收的原因,MAT会自动生成一个包含内存泄漏疑点的报告。 MAT是有两种安装方式的,这一点与其他eclipse插件略有不同。 ...
mat工具,mat工具,mat工具,mat工具,mat工具备份
MAT工具全称为Memory Analyzer Tool,一款详细分析Java堆内存的工具,该工具非常强大,为了使用该...但是该文件不能直接被MAT使用,需要进行一步转化,可以使用hprof-conv命令来转化,但是Android Studio可以直接转化.
可使用GetDlgItem(IDC_picture)等方法获取(IDC_picture为picture控件的ID),Mat img参数即为你要显示Mat格式的图片。直接将函数放入程序中调用就可以使用,无需做任何改动,图片自适应你的picture控件的大小。
从同一路径下,批量读取mat文件到matlab中,以便进行下一步计算
C#语言下,官方好像没有提供直接的方式把Bitmap转为Mat,但是可以使用我的这个方式转变格式
BFM.mat MorphabelModel
该压缩包含几个小程序,用于将nc文件转换为mat文件,使用时请注意路径和变量更改。
将TDMS格式转换为matlab可读的mat文件。批量转换文件夹下的所有文件。 自动索引TDMS文件的组名和通道名称。自动命名mat文件名与TDMS文件名一致。 改了一晚上,大家支持下。
将.dat文件转换成matlab可读取的.mat文件。将.scv文件转换成matlab可读取的.mat文件。
1: 输出一个Mat对象的像素 自定义一个Mat 对象,然后输出像素值(像素值基本都在 0 – 255 之间 ,图像为三通道) 代码 public static void F1() { Scalar s = new Scalar(0, 0, 255); //定义一个三通道颜色...
matlab默认使用的数据格式是mat,而weka在数据挖掘中经常用到,但其默认格式为arff。利用本代码可以将mat格式数据自动转为arff格式,自动添加数据头信息。能够很好处理高维度数据
最新版的pl42mat,可在win10上使用,将ATP计算结果转换为mat格式方便在MATLAB中分析
matlab开发-json4mat。这个matlab工具箱将json格式转换为(json2mat)和(mat2json)matlab结构。
mat使用示例
mat格式的文件,里头的数据用labview显示,并且有labview存成mat格式的文件。
OPENCV_Mat类存取方法