精华内容
下载资源
问答
  • Android studio结合MAT分析hprof文件

    千次阅读 2018-10-16 10:49:27
    对于Android性能优化,其中很重要一块就是内存优化,内存优化主要还是解决内存泄漏...3、使用MemoryAnalyzer(MAT)分析; 对于这三步,如果对内存消耗这块没有严格要求,一般使用LeakCarary就可以了。 如果对内存...

    对于Android性能优化,其中很重要一块就是内存优化,内存优化主要还是解决内存泄漏问题,我一般分为三步进行排查:

    1、使用LeakCanary进行初步排查;

    2、使用Android studio自带的Android Profiler分析;

    3、使用MemoryAnalyzer(MAT)分析;

    对于这三步,如果对内存消耗这块没有严格要求,一般使用LeakCarary就可以了。

    如果对内存管控比较严格,一般使用Android Profiler也是可以的,如果还不能定位到问题就可以使用MAT了。LeakCanary这里就不做介绍了,使用非常简单。

    LeakCanary地址:https://github.com/square/leakcanary

    Android Profiler分析hprof

    1、获取hprof文件,可以看下:Android studio导出hprof到MAT工具流程

    2、进入到Android Profiler分析内存的地方,如下图:

    这里先对上面的一些名词做下解释:

    Class Name:对象的类型,比如byte[]就是说这里的对象都是byte数组类型;

    Allocations:生成对象的数量,这里还是拿byte[]来说,这里的360就是说生成了360个byte[]对象;

    Shallow Size:这些对象所占用的内存(不包括引用对象),这里还是拿byte[]来说,这里的25218442就是360个byte[]对象所占的内存,单位是B,也就是25218442/1024/1024M;

    Retained Size:这些对象所占用内(包括应用对象),内存释放时,实际释放的大小就是这里的大小;

    举个例子可能就更明白了,有两个对象,对象A的大小是20kb,对象B的大小是10kb,对象B是对象A的成员变量,那么:

    Class Name:A     Allocations:2    Shallow Size:2*20*1024     Retained Size:2*20*1024+2*10*1024

    Class Name:B     Allocations:1   Shallow Size:10*1024     Retained Size:10*1024

    这样看着是不是就更容易理解了。

    相对于MAT来说,Android Profiler就是不好对比,个人感觉还是挺好用的,对于一些内部类、单例模式中的静态引用造成的内存泄露,用LeakCanary都可以检查出来,这里就不多说了,这里说个我遇到的内存泄露,是由逻辑处理上引发的内存泄露:在应用中有许多图片,需要预览大图,预览大图时使用的是全屏的dialog(dialog中使用了viewpage展示图片)。后面在做内存分析的时候,发现byte[]这块增长好快,那就点进去看下,如下图:

    点击上面的item,下面就会出现相对应的Reference,可以看出这些byte是被bitmap给占用了,展开bitmap的引用链可以查看到bitmap最终是被谁引用了,,这里也可以查看这些byte是被那张图图片给占用了,右键点击如下图:

    之后点击Go to Instance就可以查看这张图片了,如果是代码的话,可以点击Jump to Source跳转到对应的代码中,这些功能在MAT中是没有的,这些都可以帮助我们分析是哪引起的内存泄露。经过上面的分析确定是取消dialog展示图片时,并没有使得图片资源得到释放, 按理说,dialog消失了,资源就该释放了,但为什么没有释放,这就得去看看代码了,由于在代码中将这个dialog声明为了全局变量,取消的时候又没有去置null,这就意味着图片是可以寻找到GC Root的(对GC Root的概念这里不做介绍了,感兴趣的可以自己去百度),这就是说图片的资源是不可能被释放的,那要怎么做呢?其实也很简单,在取消dialog后,将dialog置为null就可以了。关于内存的分析,情况不一样,分析起来也是不一样的,像这种可以说是由逻辑引起的,使用LeakCarary是分析不出来的。对于Android Profiler分析内存泄露,如果有怀疑泄露的地方,或是像这样有明显内存增大的地方还是比较好分析的,如果这样还会分析不出来,那就的使用MAT了。

    MAT分析hprof文件

    MAT的方便之处在于可以对比两份hprof文件,什么意思呢?在操作之前获取一份hprof文件,这是没有内存泄露的文件,然后不断的去操作,之后回到操作之前的界面,再去获取一份hprof文件,这样就拿到了两份文件,这样就可以去对比这两份文件中生成对象的差异,多出的对象很可能就是发生了内存泄露,这里来看看如何去对比两份文件,关于如何导出hprof文件及使用MAT打开请看:Android studio导出hprof到MAT工具流程

    使用MAT打开hprof文件的界面如下:

    这里主要说下Histogram和Dominator Tree这两个点,大多数时候用到的也是这两个点:

    1、Histogram是针对对象的数量,可以这么理解,一个类可以创建多个对象,这里查看的就是一个类总共创建了多少个对象;

    2、Dominator Tree是针对的对象引用关系,以及该类所有实例对象所占用内存的百分比;

    这里以Histogram为例点进去看下:

    这里以byte[]为例,这里的Objects是1670,就是说内存中byte[]对象的数量是1670,Shallow Heap的大小13568768,这个大小代表的是这1670个byte[]对象所占用的内存,关于Shallow Heap和Retained Heap的意思其实就是上面提到的Shallow Size和Retained Size,这样看着就和Android Profiler是一样的了,接下来就来看看MAT是如何去对比两份hprof文件的,这里是在Histogram界面,然后在下面的Navigation History选中histogram点击右键,在点击Add to Compare Basket,如下图:

    这样操作完后以同样的方式打开另一份hprof文件,结果如下图:

    这样操作完后在点击上图红框标示的地方,就可以得到对比的结果,如下图:

    这个图就是hprof的对比结果,可以看到byte[]类的对象由1670增加到了1687个,所占用的内存由13568768增加到了54004896个byte,如果觉得这样的对比结果不够明显,那么还可以点击上面的红框部分进行计算对比,比如:

     对于这样的一份结果,我们应该主要去分析内存泄露比较大的地方,这里占用内存大的地方是byte[],那我们就可以邮件点击做如下操作:

     这样就可以得到GC Root的引用,如下图:

    但是结果并没有找到GC Root,所以分析到这就跟不下去了,不过到这我们可以结合下Android Profiler,在Android Profiler中是可以找到GC Root,并且可以知道这份byte[]是一份什么样的数据,比如是图片,那么就可以知道这张图片是什么样的,这里针对的是byte[]数据,如果是是我们自己定义的类对象,一般都是可以找到GC Root的,如果是在不行,那就在回过头来结合Android Profiler分析了。

    总结:

    1、对于由于静态内部类、静态引用等引起的内存泄露,这部分内存泄露是比较好分析,直接使用LeakCanary就可以,可以帮助解决绝大部分的内存泄露。

    2、如果还需要细致的内存分析,首先使用的应该是Android studio自带的Android Profiler,这个自带的工具也是很强大的,使用的好基本上是可以帮助我们解决内存泄露的。

    3、对于使用Android Profiler还是分析不出来,那就在结合MAT工具了,内存泄露基本就没什么问题了。

    还有问题的欢迎一起学习讨论!

     

    展开全文
  • 生成hprof文件可以在DDMS选中进程点击窗口左上角的"dump hprof file"按钮来直接生成,也可以通过在程序加代码中来生成 代码2: voidgenerateHprof() { String packageName=getApplicationInfo().packageName; ...

    生成hprof文件可以在DDMS选中进程点击窗口左上角的"dump hprof file"按钮来直接生成,也可以通过在程序加代码中来生成

    代码2

        void generateHprof()

        {

                String packageName=getApplicationInfo().packageName;

                String hpFilePath="/data/data/"+packageName+"/input.hprof";

                try {

                      //Debug.dumpHprofData("/sdcard/input.hprof");

                      Debug.dumpHprofData(hpFilePath);

                } catch (IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                }

        }

     

    建议使用代码生成hprof,然后使用批处理hprof文件,然后用Memory Analyzer tool(MAT)进行对多个hprof文件比较分析。

     

    MAT导入.hprof文件以后,MAT会自动解析并生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package类,比较各个类在不同时期的Retained Heap,找出可疑类,然后选择该类,点右键,选中show retained Set 项,参看Retained Heap的详细信息,进一步找出嫌疑项。

     

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    一、批处理配置文件

    批处理配置文件config.bat如下:
    rem the following var is for getProcessState.bat
    set rawDatadir=rawData
    set processName=android.process.acore;com.android.systemui
    rem set processShortName=a;b;c
    set processShortName=
    set outRoot=out
    set statFilePrefix=stat
    rem the following var is for getHprof.bat
    set tools=D:\android\tools
    set hpInputFileDir=/sdcard
    set hpInputFile=input.hprof
    set hpRoot=hpTemp
    注1:rawDatadir为“ps -x”提取出来的文件的目录
    注2:processName需要统计RSS的进程的名字,可以同时统计多个,进程名之间用“;”进行分割。
    注3:processShortName需要统计RSS的进程的名字的缩写形式,如果不坐设置或设置为空,这程序会根据processName自动生成。
    注4:outRoot为对进程的RSS进行统计最后的生成文件的存放目录。
    注5:statFilePrefix为对进程的RSS进行统计最后的生成文件的前缀。
    注6:tools为hprof-conv.exe所在的目录。
    注7:hpInputFileDir为手机中我们生成的hprof文件所在的目录。
    注8: hpInputFile为 手机中我们生成的 hprof文件的名字。
    二,需要使用的bat库
    子目录lib用于存放bat库
    需要的bat库: genSerial.bat getSubStr.bat
    关于 genSerial.bat 请参看《 genSerial
    关于 getSubStr.bat 请参看《 getSubStr
    三,在代码中生成Hprof文件:
    在android代码,可以使用如下代码把hprof文件生成到sd卡上。
    Debug.dumpHprofData("/sdcard/input.hprof");
    可以不用sd卡,而将hprof文件直接生成在手机上,但是只能在"/data/data/"+packageName的目录下。
    实例1
        void generateHprof()
        {
    String packageName=getApplicationInfo().packageName;
    String hpFilePath="/data/data/"+packageName+"/input.hprof";
    try {
    //Debug.dumpHprofData("/sdcard/input.hprof");
    Debug.dumpHprofData(hpFilePath);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
        }
     
    四,在电脑上通过批处理取转换Hprof 文件
    如果在程序中用 Debug.dumpHprofData("/sdcard/input.hprof") 的方式生成了 hprof文件
    那么就可以执行文件getHprof .bat来取得 Hprof并转化为MemoryAnalyzer的格式。
    getHprof.ba t文件如下:
    @echo off
    call config.bat
    if exist %hpInputFile% (
    del %hpInputFile% /q
    )
    adb pull %hpInputFileDir%/%hpInputFile% .
    if not exist %hpInputFile% (
    echo fail to pull %hpInputFile%
    exit 1
    )
    if not exist %hpRoot% (
    md %hpRoot%
    )
    Setlocal enabledelayedexpansion
    set path=%path%;%cd%\lib
    call genSerial
    set serial=!genSerial~result!
    set hpOutFile=%serial%.hprof
    %tools%\hprof-conv.exe %hpInputFile% %hpRoot%\%hpOutFile%
    echo success!
    endlocal
    注1: 需要在代码中先生成 hprof文件 ,而且config.bat中配置的路径要和 在代码中先生成 hprof文件的路径一致。
    注2 如果需要连续多次以固定的时间提取 hprof文件 ,请参照《 Android内存泄露利器(全自动篇)
    注意3 :需要把bat库genSerial.bat,getSubStr.bat放在子目录lib中。

    转载于:https://www.cnblogs.com/ccxniit2004/p/3613495.html

    展开全文
  • MAT打开.hprof文件

    千次阅读 2019-02-08 17:20:39
    开始还以为是 MAT 与java的版本不匹配,其实是 android 刚刚生成的 .hprof 文件在这里需要进行转换一下格式。  打开命令行窗口,在android SDK目录,执行以下命令: hprof-conv 1.hprof 2.hprof ...

    Unknown HPROF Version (JAVA PROFILE 1.0.3) (java.io.IOException)解决办法

    开始还以为是 MAT 与java的版本不匹配,其实是 android 刚刚生成的 .hprof 文件在这里需要进行转换一下格式。 

    打开命令行窗口,在android SDK目录,执行以下命令:

    hprof-conv  1.hprof   2.hprof

    phrof-conv.exe 的文件,需要手动添加到sdk的tools文件夹下面(已经添加到环境变量)

    .hprof文件由android-studio生成或者其他方式,然后转换格式后,用MAT工具打开就可看到内存快照,进行内存分析

     

     

    展开全文
  • 使用MAT的命令行工具分析hprof文件

    千次阅读 2017-11-10 15:26:50
    对于内存dump文件比较大的情况,如何使用MAT进行内存泄漏和溢出分析。

    Eclipse Memory Analyzer

    对于MAT这个专业的内存泄漏分析工具,大家应该都比较熟悉,用起来很方便,只需要打开Eclipse,然后把jmap或者jvm dump出来的文件拖到Eclipse里面,就会自动分析,然后以页面的形式展示出来结果。

    在结果里面可以看到内存总体情况、泄漏嫌疑对象、以及所有对象的内存占用情况。这对我们找到内存溢出、内存泄漏的元凶帮助很大。

    但是对于生产环境,总会遇到这样的问题,dump出来的文件8g以上,比较大,自己的台式机或者笔记本的内存根本不够用。况且Eclipse启动起来,就占1个G的内存。

    下载MAT

    以前一般是直接以插件的形式安装到Eclipse里面,其实MAT是可以独立运行的,我们需要到官网下载独立包。

    这里写图片描述

    选择Linux(x86_64/GTK 2)版本,下载下来,然后到自己的服务器上进行解压,执行:

    unzip mat.zip

    配置MAT

    解压之后,需要修改mat的配置文件,打开MemoryAnalyzer.ini文件,修改-Xmx的值,使大于hprof文件的大小,建议是其2倍大小。

    -startup
        plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
        --launcher.library
        plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.100.v20110505
        -vmargs
        -Xms16g
        -Xmx16g

    执行分析命令

    执行如下命令会输出泄漏嫌疑对象的分析结果,这个结果是比较全面的。

    ./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects

    还支持另外两个分析结果:

    org.eclipse.mat.api:overview
    org.eclipse.mat.api:top_components 

    出结果的速度很快,8G的文件,大概10来分钟出结果。

    运行后,会生成如下的几个压缩包,解压后打开其中的html页面即可看到结果。

    这里写图片描述

    展开全文
  • 1、使用Android Studio内置的Android Profilter 生成hprof文件 打开Android Profilter(View -> Tool View -> Android Filter) 2、把hprof文件转换为mat可以识别的标准格式,打开命令行:hprof-conv ...
  • 1.安装unzip和zip yum install -y unzip zip 2.安装wget yum -y install wget ...4.解压进入到mat目录下修改最大内存,根据hprof文件大小进行修改 vi MemoryAnalyzer.ini 5.对目标hprof文件进行分
  • 系统宕机了,weblogic生成 .phd 和 javacore文件,分别使用 jca457.jar 和 ha456.jar来分析,但是heapdump文件分析时指向的问题和...需要修改startWebLogic.sh文件,宕机时就会自动生成对应的hprof文件 LOG_OPTI
  • java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php 说明: 查看HPROF快照  JProfiler能打开用JVM工具(比如...
  • 1.找到路径 2.转换想要转换的hprof文件
  • Android生成heap dump文件(.hprof)一个heap dump就是一个程序heap...对于Android运行android.os.Debug.dumpHprofData(hprofPath)方法后所生成的文件,须要把.hprof文件从Dalvik格式转换成J2SE HPROF格式。使用And...
  • Android studio导出hprofMAT工具流程

    千次阅读 2018-10-11 19:07:41
    准备MAT工具: 工具地址 : https://www.eclipse.org/mat/ 这里有两种方式:一是以插件的...对于生成hprof文件,Android studio 3.0之后的版本和3.0之前的版本可以说是完全不一样的,如果你使用过eclipse开发过...
  • jvm调优-hprof 文件打开

    2021-11-12 11:10:06
    最近在学习如何进行jvm的调优,在cmd命令中查看...如何打开hprof文件呢? 打开cmd命令,Ctrl + R 输入:jvisualvm,就会打开jdk目录下jvisualvm.exe 打开本地的文件 我们就可以查看 hprof文件内容了 ...
  • 背景:生产环境有一个程序突然挂掉了,进去控制台没有任何反应,看到服务器已经生成hprof文件,hprof后缀文件是堆内存溢出导致程序挂掉时保存的快照,但是是什么原因导致程序内存溢出的呢?记录一下分析hprof文件...
  • hprof是什么文件

    千次阅读 2021-02-13 00:19:06
    hprof是什么文件?是java进程的内存镜像文件,里面包含了内存堆详细的使用信息。最近学习深入java虚拟机的书,照着里面的例子跑了下。如何打开hprof?下面是demo:/*** VM Args:-Xms20m -Xmx20m -XX:+...
  • 生成hprof文件有1.2G,为了查看该hprof文件,使用Eclipse上的 Memory Analyzer工具 2,安装Memory Analyzer (1)打开Eclipse–help – Eclipse Macketplace (2)搜索memory出现下面的界面 (3)点击install (4...
  • JVM性能调优监控工具hprof使用详解

    千次阅读 2021-02-27 21:01:15
    二、hprof文件的生成 生成hprof文件可以在DDMS(DDMS的全称是DalvikDebug Monitor Service,是Android开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、...
  • hprof文件打开和转换方式

    万次阅读 2017-01-03 10:49:36
    MAT中点击 File->Open File,浏览到刚刚转换而得到的.hprof文件,并Cancel掉自动生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package 类点右键,在弹出菜单中选择List objects->With incoming ...
  • 内存泄漏--抓取.hprof文件的方法总结

    万次阅读 2018-01-18 18:07:21
    1、AS抓取文件 (1)遇到的问题及解决:(1-1)android studio no debuggable processes(1-2)解决办法(a)Tools->Android->勾选上Enable ADB Integration(b)重新布置app (2)下图为用as抓取hprof文件中...
  • 以下为本人翻译,仅用于交流学习,版权归原作者所有,转载注明出处,请不要用于商业用途 。HPROF:使用Eclipse Memory Analyzer 工具 (MAT)进行内存泄露分析在这个部分,我们将会给你演示如何通过产生一个HotSpot
  • hprof 分析工具

    千次阅读 2021-05-16 09:20:06
    生成堆的dump文件 通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没有启动JMX可以通过Java的jmap命令来生成该文件。 3.分析dump文件 打开这个3G的堆信息文件,显然一般的Window...
  • 命令行提取hprof文件 1. #adb shell am dumpheap 2. #adb pull 3. #/android-sdk/platform-tools/hprof-conv .hprof 4. 使用MAT分析
  • Android.hprof 文件转换

    千次阅读 2016-06-30 22:37:25
    如何用MAT来分析,前提是Android开发和测试的工具安装完整,SDK,Eclipse: 1.打开Eclipse 2.选择 Help->Install New Software; 3.在Work with中添加站点:http://download.eclipse.org/mat/1.0/update-site/(这...
  • 一,首先打开需要分析内存泄漏的界面,链接AndroidStudio,借助AS中的Profiler工具监控...然后点击旁边步骤2按钮,一个下载图标,等待几秒中后左侧回出现一个HeapDump item,这个就是生成好的xxx.hprof文件。点击...
  • * 使用MAT工具读取dump中hprof文件,从而找到内存溢出的原因: * 1.百度搜索MAT,下载对应电脑版本的zip * 2.解压下载的zip到指定文件夹 * 3.双击MemoryAnalyzer.exe运行 * 4.点file->open heap dump->...
  • [MAT]使用MAT比较多个heap dump文件

    万次阅读 2014-08-12 11:39:39
    这时需要生成多个单独的HPROF文件。下面是一些关于如何在MAT里比较多个heap dumps的内容(有一点复杂):1. 第一个HPROF 文件(usingFile > Open Heap Dump ).2. 打开Histogram view.图1. Histogra

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,999
精华内容 2,399
关键字:

mat生成hprof文件