mat 使用笔记

本文介绍如何使用MAT进行Java应用程序的内存分析,包括理解不同类型的引用、关键术语解释、实际操作步骤,以及如何定位和解决内存泄漏问题。

 

MAT 使用初探

今天线上一个应用的持久区满了,一直没有下来,导致一些服务不可用,就用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(字符串驻留)

 

 

 

OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,主要用于实时图像处理、计算机视觉任务和机器学习应用。在C++中使用OpenCV需要注意以下几个关键点: 1. **安装**:首先需要从官网下载适合你的平台的版本,并按照文档安装。确保路径添加到系统环境变量中,以便程序能够找到库文件。 2. **基本结构**:OpenCV的主要数据结构包括Mat(矩阵),它是最基本的数据容器,用于存储图像和像素数据。还有其他如Point、Size、Rect等用于表示几何形状的对象。 3. **函数使用**:OpenCV提供大量图像处理和计算机视觉函数,例如读取和显示图片(imread、imshow)、图像操作(resize、crop)、颜色空间转换、边缘检测(Canny)、特征提取(SIFT、SURF)以及机器学习模块(比如Haar cascades用于人脸检测)。 4. **模板编程**:利用OpenCV提供的API,通常通过模板类和函数来编写代码,因为很多操作都是针对不同类型的图像矩阵。 5. **异常处理**:由于OpenCV函数可能会抛出错误,记得在关键部分使用try-catch块来捕获并处理异常。 6. **内存管理**:Mat对象在内部管理其内存,但建议手动释放不再使用的大型矩阵,避免内存泄漏。 7. **多线程支持**:OpenCV提供了线程安全的函数,如果你需要在多线程环境中工作,确保正确同步访问共享资源。 8. **实践项目**:熟悉OpenCV最好的方式就是实际参与一些项目,比如图像分类、物体追踪等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值