zoukankan      html  css  js  c++  java
  • 生成hprof文件,用MAT进行分析

    生成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 ools
    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文件所在的目录。
    注8hpInputFile为手机中我们生成的hprof文件的名字。
    二,需要使用的bat库
    子目录lib用于存放bat库
    需要的bat库:genSerial.batgetSubStr.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.bat文件如下:
    @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中。
  • 相关阅读:
    JWT(json web token)--.JwtBearer jwt
    NET LOG日志的使用以及设置文件大小和数量限制
    Xshell、MobaXterm等5款主流SSH客户端对比
    RabbitMQ使用交换机处理异步消息队列------发布与订阅
    RabbitMQ使用交换机处理异步消息队列------分布式事务处理案例
    RabbitMQ使用交换机处理异步消息队列案例
    SqlServer Microsoft SQL Server 2005 使用复制(发布、订阅)的方式使主从数据库同步
    Hangfire-执行定时任务框架
    Catalina 默认使用zsh了,你可习惯
    你几点睡,就是什么命
  • 原文地址:https://www.cnblogs.com/ccxniit2004/p/3613495.html
Copyright © 2011-2022 走看看