精华内容
下载资源
问答
  • 内存分析工具MAT使用

    2017-02-08 09:43:31
    图文并茂,具体实例的形式说明内存泄露分析工具MAT的具体使用方法
  • MAT使用手册无加密.pdf

    2020-04-19 10:07:53
    MAT,分析堆dump文件的一个工具,结合Eclipse使用,因为工具使用都是英文,不方便操作,此pdf详细介绍功能使用
  • MAT使用说明

    千次阅读 2018-12-26 17:06:32
    第一次打开文件MAT进行分析处理会比较慢。 打开以后会展示如下效果 上图中的几个主要信息: Details: 堆内存大小(Size)、类的数量(Classes)、对象的数量(Objects)、类加载器的数量(Class Loader)。 Biggest ...

    打开dump文件

    菜单 > File > Open Heap Dump

    第一次打开文件MAT进行分析处理会比较慢。

     

    打开以后会展示如下效果

     

    上图中的几个主要信息:

    • Details: 堆内存大小(Size)、类的数量(Classes)、对象的数量(Objects)、类加载器的数量(Class Loader)。
    • Biggest Objects by Retained Size:堆内存中最大的对象及占用内存大小。当鼠标移动到饼图的某个区域后在窗口的左面会显示出一些详细信息(包含类的信息、静态变量、类变量、类结构等)。
      • List objects -> with outgoing references:查看此对象引用的外部对象.
      • List objects -> with incoming references:查看引用此对象的外部对象.
      • Path To GC Roots: 查看对象的GC Root路径。
        • exclude xxx references:排除一些软引用、弱引用、虚引用.如果只有强引用存在,GC就一直无法回收对象,进而导致内存泄露。
    • Actions:列出一下常用的操作。
      • Histogram:列出每个类的对象数量和占用内存大小,默认使用Shallow Heap排序。
      • Dominator Tree:列出堆中占用比较大的类型,按照内存占用大小排序。
      • Top Consumers:按照类、类加载器和包等信息进行分组展示出最大的对象。
      • Duplicate Classes:列出被多个类加载器重复加载的类列表。
    • Reports:一些统计报表
      • Leak Suspects:泄漏分析报告。报告中尝试找出可能导致内存泄露的地方,并对找到的可以地方做了详细描述。
      • Top Components
    • Step By Step:按照帮助一步一步的操作。
    • 点击齿轮()标可以查看线程相关信息。如下图:

    几个概念:

    • Shallow Heap:对象本身占用的内存大小,不包含其引用的对象。对象本身占用的内存大小根据其本身的类型和成员变量的数量决定。数组的大小根据元素的类型(基本数据类型、对象类型)和数组的长度决定。Java的对象的成员变量保存的都是引用,所以导致在堆内存中真正占用内存大的都是基本数据类型的数组(byte[]/char[]/int[]),所以在Histogram中占用内存比较大的数据就出现下图所示的那样。

    • Retained Heap:该项代表因为当前对象被回收而减少引用进而被回收的所有对象所占用的内存大小。通俗点讲就是该对象所引用的所有对象(包含被递归引用的对象)占用的内存大小。


    Histogram信息如下图:

     

    Dominator Tree信息如下图:

     

    Top Consumers信息如下图:

     

    Duplicate Classes信息如下图:


    dupm内存命令

    1. jmap -dump:format=b,file=xxx.bin <pid>
    展开全文
  • MAT 使用教程

    千次阅读 2018-07-02 10:01:55
    MAT 使用教程 Memory Analysis Tools (MAT) 是一个分析 Java 堆数据的专业工具,用它可以定位内存泄漏的原因。 观察 Heap 运行程序,然后进入 DDMS管理界面,如下: 点击工具栏上的 来更新统计信息 点击...

    MAT 使用教程

    Memory Analysis Tools (MAT) 是一个分析 Java 堆数据的专业工具,用它可以定位内存泄漏的原因。

    观察 Heap

    运行程序,然后进入 DDMS管理界面,如下:

    image

    点击工具栏上的image 来更新统计信息

    点击右侧的 Cause GC 按钮或工具栏上的 image 即可查看当前的堆情况,如下:

    image

    主要关注两项数据:

    • Heap Size 堆的大小,当资源增加,当前堆的空余空间不够时,系统会增加堆的大小,若超过上限 (例如 64M,视平台和具体机型而定)则会被杀掉

    • Allocated 堆中已分配的大小,这是应用程序实际占用的内存大小,资源回收后,此项数据会变小。

    查看操作前后的堆数据,看是否有内存泄漏。对单一操作(比如添加页,删除页)进行反复操作,如果堆的大小一直增加,则有内存泄漏的隐患。

    利用MAT分析内存堆

    DDMS 可以将当前的内存 Dump成一个 hprof格式的文件,MAT 读取这个文件后会给出方便阅读的信息,配合它的查找,对比功能,就可以定位内存泄漏的原因。

    获取 hprof文件

    点击工具栏上的image按钮,将内存信息保存成文件。 如果是用 MAT Eclipse 插件获取的 Dump文件,则不需要经过转换,Adt会自动进行转换然后打开。

    转换 hprof文件

    DDMS Dump 出的文件要经过转换才能被 MAT识别,Android SDK提供了这个工具 hprof-conv (位于 sdk/tools下)

    ./hprof-conv xxx-a.hprof xxx-b.hprof

    用 MAT打开转换后的 hprof文件

    image

    Histogram 查询

    用的最多的功能是 Histogram,点击 Actions下的 Histogram项将得到 Histogram结果:

    image

    它按类名将所有的实例对象列出来,可以点击表头进行排序,在表的第一行可以输入正则表达式来匹配结果 :

    image

    在某一项上右键打开菜单选择 list objects ->with incoming refs 将列出该类的实例:

    image

    它展示了对象间的引用关系,比如展开后的第一个子项表示这个 HomePage(0x420ca5b0)被 HomePageContainer(0x420c9e40)中的 mHomePage属性所引用.

    快速找出某个实例没被释放的原因,可以右健 Path to GC Roots–>exclue all phantom/weak/soft etc. reference :

    image

    得到的结果是

    image

    从表中可以看出 PreferenceManager -> … ->HomePage这条线路就引用着这个 HomePage实例。用这个方法可以快速找到某个对象的 GC Root,一个存在 GC Root的对象是不会被 GC回收掉的.

    Histogram 对比

    为查找内存泄漏,通常需要两个 Dump结果作对比,打开 Navigator History面板,将两个表的 Histogram结果都添加到 Compare Basket中去 :

    image

    添加好后,打开 Compare Basket面板,得到结果:

    image

    点击右上角的 ! 按钮,将得到比对结果:

    image

    注意,上面这个对比结果不利于查找差异,可以调整对比选项:

    image

    再把对比的结果排序,就可得到直观的对比结果:

    image

    也可以对比两个对象集合,方法与此类似,都是将两个 Dump结果中的对象集合添加到Compare Basket中去对比。找出差异后用 Histogram查询的方法找出 GC Root,定位到具体的某个对象上。

    例子

    举例一个典型的分析内存泄漏的过程:

    1. 使用 Heap查看当前堆大小为 23.00M
    2. 添加一个页后堆大小变为 23.40M
    3. 将添加的一个页删除,堆大小为 23.40M
    4. 多次操作,结果仍相似,说明添加/删除页存在内存泄漏 (也应注意排除其它因素的影响)
    5. dump 出操作前后的 hprof 文件 (1.hprof,2.hprof),用 mat打开,并得到 histgram结果
    6. 使用 HomePage字段过滤 histgram结果,并列出该类的对象实例列表,看到两个表中的对象集合大小不同,操作后比操作前多出一个 HomePage,说明确实存在泄漏
    7. 将两个列表进行对比,找出多出的一个对象,用查找 GC Root的方法找出是谁串起了这条引用线路,定位结束

    PS :
    - 很多时候堆增大是 Bitmap引起的,Bitmap在 Histogram中的类型是 byte [],对比两个 Histogram中的 byte[] 对象就可以找出哪些 Bitmap有差异
    - 多使用排序功能,对找出差异很有用

    展开全文
  • MAT使用进阶(使用方法)

    万次阅读 2018-08-10 11:49:07
    MAT使用进阶 Java的内存泄露 Java中的内存泄露主要特征:可达,无用 无用指的是创建了但是不再使用之后没有释放 能重用但是却创建了新的对象进行处理 MAT使用技巧 使用Android Studio Dump内存文件 Android ...

    原文:

    MAT使用进阶

    Java的内存泄露

    • Java中的内存泄露主要特征:可达,无用
    • 无用指的是创建了但是不再使用之后没有释放
    • 能重用但是却创建了新的对象进行处理

    MAT使用技巧

    使用Android Studio Dump内存文件

    Android Studio的最新版本可以直接获取hprof文件:

    Android-Studio

    Android-Studio

    然后选择文件,点击右键转换成标准的hprof文件,就可以在MAT中打开了。

    在使用使用Eclipse或者AndroidStudio抓内存之前,一定要手动点击 Initiate GC按钮手动触发GC,这样抓到的内存使用情况就是不包括Unreachable对象的。

    手动触发GC

    手动触发GC

    Unreachable对象

    Unreachable指的是可以被垃圾回收器回收的对象,但是由于没有GC发生,所以没有释放,这时抓的内存使用中的Unreachable就是这些对象。

    Unreachable Objects

    Unreachable Objects

    Unreachable Objects Histogram

    Unreachable Objects Histogram

    点击Calculate Retained Size之后,会出现Retained Size这一列

    Calculate Retained Size

    Calculate Retained Size

    Unreachable Objects Histogram

    Unreachable Objects Histogram

    可以看到Unreachable Object的对象其Retained Heap值都为0.这也是正常的。

    Histogram

    MAT中Histogram的主要作用是查看一个instance的数量,一般用来查看自己创建的类的实例的个数。

    • 可以很容易的找出占用内存最多的几个对象,根据Percentage(百分比)来排序。
    • 可以分不同维度来查看对象的Dominator Tree视图,Group by class、Group by class loader、Group by package
      和Histogram类似,时间久了,通过多次对比也可以把溢出对象找出来。
    • Dominator Tree和Histogram的区别是站的角度不一样,Histogram是站在类的角度上去看,Dominator Tree是站的对象实例的角度上看,Dominator Tree可以更方便的看出其引用关系。

    Histogram group by package

    Histogram group by package

    通过查看Object的个数,结合代码就可以找出存在内存泄露的类(即可达但是无用的对象,或者是可以重用但是重新创建的对象

    Histogram中还可以对对象进行Group,更方便查看自己Package中的对象信息。

    Paste_Image.png

    Paste_Image.png

    Thread信息

    MAT中可以查看当前的Thread信息:

    Thread

    Thread

    从图中可以得到的信息:

    1. 可以看到可能有内存问题的Thread:

      内存异常

      内存异常

    2. 可以看到数量可能有问题的Thread

      数量异常

      数量异常

    帮助信息

    MAT中的各个视图中,在每一个Item中点击右键会出现很多选项,很多时候我们需要依赖这些选项来进行分析:

    右键选项

    右键选项

    这些选项的具体含义则可以通过右键中的Search Queries这个选项(上图中的倒数第四个选项)进行搜索和查看,非常的有用。

    帮助信息

    帮助信息

    可以看到,所有的命令其实就是配置不同的SQL查询语句。

    比如我们最常用的:

    • List objects -> with incoming references:查看这个对象持有的外部对象引用
    • List objects -> with outcoming references:查看这个对象被哪些外部对象引用
    • Path To GC Roots -> exclude all phantim/weak/soft etc. references:查看这个对象的GC Root,不包含虚、弱引用、软引用,剩下的就是强引用。从GC上说,除了强引用外,其他的引用在JVM需要的情况下是都可以 被GC掉的,如果一个对象始终无法被GC,就是因为强引用的存在,从而导致在GC的过程中一直得不到回收,因此就内存溢出了。
    • Path To GC Roots -> exclude weak/soft references:查看这个对象的GC Root,不含弱引用和软引用所有的引用.
    • Merge Shortest path to GC root :找到从GC根节点到一个对象或一组对象的共同路径

    Debug Bitmap

    如果经常使用MAT分析内存,就会发现Bitmap所占用的内存是非常大的,这个和其实际显示面积是有关系的。在2K屏幕上,一张Bitmap能达到20MB的大小。

    所以要是MAT提供了一种方法,可以将存储Bitmap的byte数组导出来,使用第三方工具打开。这个大大提高了我们分析内存泄露的效率。

    关于这个方法的操作流程,可以参考这篇文章还原MAT中的Bitmap图像.

    Debug ArrayList

    ArrayList是使用非常常用的一个数据结构,在MAT中,如果想知道ArrayList中有哪些数据,需要右键-> List Objects -> With outgoing references,然后可以看到下面的图:

    Outgoing

    Outgoing

    从上图可以看到,这个ArrayList的内容在一个array数组中,即暴漏了ArrayList的内部结构,查看的时候有点不方便,所以MAT提供了另外一种查看ArrayList内数据的方式:

    Extrace List Values

    Extrace List Values

    其结果非常直观:

    Extrace List Values Result

    Extrace List Values Result

    Big Drops In Dominator Tree

    Big Drops In Dominator Tree选项在右键->

    Displays memory accumulation points in the dominator tree. Displayed are objects with a big difference between the retained size of the parent and the children and the first "interesting" dominator of the accumulation point. These are places where the memory of many small objects is accumulated under one object.

    Big Drops In Dominator Tree

    Big Drops In Dominator Tree

     

    ==============================内存文件对比 :Histogram 对比==============================

    为查找内存泄漏,通常需要两个 Dump结果作对比,打开 Navigator History面板,将两个表的 Histogram结果都添加到 Compare Basket中去 :

    添加好后,打开 Compare Basket面板,得到结果:

    点击右上角的 ! 按钮,将得到比对结果:

    注意,上面这个对比结果不利于查找差异,可以调整对比选项:

    再把对比的结果排序,就可得到直观的对比结果:

    也可以对比两个对象集合,方法与此类似,都是将两个 Dump结果中的对象集合添加到Compare Basket中去对比。找出差异后用 Histogram查询的方法找出 GC Root,定位到具体的某个对象上。

     

    展开全文
  • java堆分析工具MAT使用教程

    千次阅读 2019-09-29 15:59:34
    MAT简介 MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。 ...

    MAT简介

    MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。

    什么时候会用到MAT?
    a) OutOfMemoryError的时候,触发full gc,但空间却回收不了,引发内存泄露
    b)java服务器系统异常,比如load飙高,io异常,或者线程死锁等,都可能通过分析堆中的内存对象来定位原因

    分析文件生成方式:
    a)自动生成,jvm启动参数里添加下面配置,当发生OutOfMemoryError时,虚拟机会自动dump内存快照

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR/java.hprof"
    

    b)手动生成,通过执行jdk自带命令

    jmap -dump:format=b,file=heap.bin  <pid>
    

    接下就可以用 MAT打开转换后的.hprof文件

    打开后的首页,里面是一些堆的基本概要信息,比如空间大小、类的数量、对象实例数量、类加载器等等
    在这里插入图片描述


    MAT统计维度与使用

    Atcion里面提供了多种分析维度:

    • Histogram可以列出内存中的对象,对象的个数以及大小。
    • Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
    • Top consumers通过图形列出最大的object。
    • Leak Suspects通过MA自动分析泄漏的原因。

    下面分别介绍这几个分析维度

    Histogram
    它按类名将所有的实例对象列出来,点击表头(Class Name)可以排序,第一行输入正则表达式可以过滤筛选 ;

    • Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用;
    • Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收的内存大小;
      在这里插入图片描述

    在某一项上右键打开菜单选择 list objects :

    • with incoming references 将列出哪些类引入该类;
    • with outgoing references 列出该类引用了哪些类
      在这里插入图片描述

    Dominator Tree
    可以列出内存中存活的大对象列表,优点是有Percentage字段,可以看各种情况的百分比。
    在这里插入图片描述
    分组工具可以根据自己的需求分组查找,默认根据class分组。
    在这里插入图片描述
    快速找出某个实例没被释放的原因,可以右健 Path to GC Roots–>exclude all phantom/weak/soft etc. references
    它展示了对象间的引用关系。
    在这里插入图片描述
    在这里插入图片描述


    Top consumers
    在这里插入图片描述多种维度(包括 类大小、类加载器、包名)展示占用内存比较多的对象的分布,从而定位内存资源主要耗费在哪些地方!


    Leak Suspects
    在这里插入图片描述
    MAT插件会给出一份可疑的分析报告,非常方便,我们只需结合源代码稍加分析到底哪个Problem才是引发问题真正原因所在。

    展开全文
  • MAT使用教程

    万次阅读 2015-09-27 00:36:16
    MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。...
  • mat分析中文文档

    2019-07-06 12:13:57
    MemoryAnalyzer 使用中文 文档
  • IBM MAT(Memory Analysis Tools分析工具+JDK8_64位
  • Android 性能优化之(1)-MAT使用教程

    千次阅读 2015-12-16 23:11:53
    Android 性能优化之——MAT使用教程官方地址参考地址 1.Eclipse安装Allocation tracker插件 MAT是一个Eclipse插件,同时也有单独的RCP客户端。 如果安装Eclipse插件(更方便使用,本文介绍的是使用Eclipse插件...
  • MAT使用 下载:http://eclipse.org/mat/downloads.php MAT工具全称为Memory Analyzer Tool,一款详细分析Java堆内存的工具,该工具非常强大,为了使用该工具,我们需要hprof文件。但是该文件不能直接被MAT使用,...
  • MAT使用进阶

    千次阅读 2017-08-23 20:47:39
    MAT使用进阶 Java的内存泄露 Java中的内存泄露主要特征:可达,无用无用指的是创建了但是不再使用之后没有释放能重用但是却创建了新的对象进行处理 MAT使用技巧 使用Android Studio Dump内存文件 ...
  • MAT——使用示例教程

    2020-10-21 17:03:21
    使用教程 1.首先弄个内存泄漏的场景 /** * ThreadLocal误用,模拟并发内存泄漏场景 * 可把JVM option -xmx设置小一些,例如800m,方便触发mmo */ @RequestMapping(value = "/test0") public String..
  • Eclipse MAT 安装及使用

    万次阅读 2018-05-03 15:35:01
    STS安装方法 Eclipse MAT官方网页:https://www.eclipse.org/mat/downloads.php ...搜索 ‘mat’ 然后安装Memory Analzer 1.6.1 重启STS 安装过程中可能会报错:No repository found containing: osgi.b...
  • Mac 下如何使用MAT

    千次阅读 2019-04-19 18:58:55
    官网下载地址: ...解压打开之后双击mat会出现错误提示: 解决方法: 图片演示终端需要进入的路径 打开终端 进入这个路径 输入 ./MemoryAnalyzer -data ./workspace 就会看见MAT可以启动了 ...
  • MAT使用实例

    千次阅读 2014-04-08 21:54:24
    使用DDMS检查这个应用的heap使用情况。你可以使用下面的方法启动DDMS: From Eclipse : click Window > Open Perspective>Other...>DDMS 在左边的面板选择进程com.founder.android.new.kyodo.activity,...
  • mat监控工具使用总结

    热门讨论 2012-04-25 17:41:01
    mat监控工具使用总结 用于分析java heap dump文件。也就是堆快照。mat工具主要用于离线分析堆快照。
  • LIBSVM-mat使用方法

    千次阅读 2010-03-08 23:35:00
    在libsvm的网站上下载libsvm-mat-2.9-1.zip文件,解压后放在任意目录下(比如c:/libsvm-mat-2.9-1下) 打开matlab,切换到c:/libsvm-mat-2.9-1目录下(cd c:/libsvm-mat-2.9-1),键入以下命令: mex
  • Android 如何使用MAT

    千次阅读 2018-06-24 17:23:16
    先下载MAThttp://www.eclipse.org/mat/downloads.php然后打开压缩包的分析工具然后在Android Studio 3.1.2上打开Android Profilegcdump然后在profile的左上角有个门一样的图标 点击导出到电脑本地我这里是C:\AS\...
  • Opencv中的Mat使用方法总结

    万次阅读 2018-06-23 22:32:54
    此文章转载自:...之前用Opencv编过不少的程序了,没想道OpenCV 2.0版本里最基础的Mat类用法还是有些不清楚,这里就总结一下一、Mat类的综述1、Mat类存储图像Mat类是OpenCV里使用广泛的一个类,其...
  • MAT 全称 Eclipse Memory Analyzer,他是一款强大的内存泄漏分析工具,mat不需要安装,下载解压就可使用。 一、工具的下载网址 下载网址 二、在AS3.X上的使用 我们知道AS3.x上找不到了 DDMS 中的Monitor,因为自...
  • MAT安装及使用教程

    万次阅读 2017-10-24 21:06:21
    MAT插件版安装步骤第一步:下载Eclipse MAT 上面两个分别是插件版的MAT、独立版的MAT。 第二步:把下载好的安装包解压到eclipse的解压路径下的dropins文件夹下,重新启动eclipse 安装成功会如下图所示 创一个java...
  • 使用Mat的Creat函数显式的创建Mat对象

    千次阅读 2019-06-13 15:56:57
    Mat M; M.creat(4,4,CV_8UC1); //创建矩阵 cout<<"M = "<<endl<<" "<<M<<endl<<endl; M.ptr<uchar>(0)[0]=12,M.ptr<uchar>(0)[1]=32; //修改其中数据 cout<<...
  • 内存分析工具MAT使用

    千次阅读 2016-09-23 13:09:15
    原文链接:http://www.jianshu.com/p/d8e247b1e7b2MAT简介MAT(Memory Analyzer ...使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表
  • 其中,对于使用数组数据块的初始化方法官方给出的例子是 ``` double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}}; Mat M = Mat(3, 3, CV_64F, m).inv(); ``` _但是我这样初始化我的Mat对象,数据为什么不对呢 ...
  • 内存分析工具 MAT使用

    万次阅读 多人点赞 2014-02-19 09:50:21
    Eclipse Memory Analysis Tools (MAT) 是一个分析 Java 堆数据的专业工具,用它可以定位内存泄漏的原因。 工具地址 :   https://www.eclipse.org/mat/ 1.1 观察 Heap ·  运行程序,...
  • opencv中Mat使用

    千次阅读 2014-01-04 21:50:51
    (一)Mat矩阵中数据指针Mat.data是uchar类型指针,CV_8U系列可以通过计算指针位置快速地定位矩阵中的任意元素。 二维单通道元素可以用Mat::at(i, j)访问,i是行序号,j是列序号。 但对于多通道的非unsigned...
  • Android Studio和MAT结合使用来分析内存问题

    万次阅读 多人点赞 2016-08-09 22:39:44
    获取hprof文件(hprof文件是我们使用MAT工具分析内存时使用的文件),但这里直接产生的文件MAT还不能直接使用,需用转换成标准的hprof文件。可以使用AndroidStudio转换或者用hprof-conv命令转化,网上可以查到 ...
  • OpenCV中使用指针遍历Mat像素

    千次阅读 2019-01-31 16:55:38
    使用Mat.at&lt;uchar&gt;(row,col)的方法速度太慢,使用指针遍历的方法速度快! 以下例子是用于何凯明去雾算法中暗通道的提取方法,取三通道图像src中每个通道对应位置的像素最小值,作为dst的对应像素值。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,296
精华内容 50,118
关键字:

mat怎么使用