Android内存分析 - 不同的保留内存结果

时间:2017-09-19 08:43:23

标签: android memory memory-leaks hprof

我试图分析我的应用程序的内存消耗。所以我有一个.hprof文件。现在疯狂的事情是,每个软件都会得到不同的结果。

我拿了一个Sample Class,在那里我比较了所有的值。几乎所有数字都是相同的,除了保留记忆。

E.g。这些工具中保留记忆的数字:

  • 在Eclipse Memory Analyzer中打开HPROF:984
  • Eclipse Memory Analyzer左侧信息:456
  • 在Android Studio中打开HPROF:470
  • 使用来自Google的Perflib阅读HPROF:568

为什么这些工具之间有这么大的差异?你们中的任何人都有类似的经历吗?

Android Studio素材 enter image description here

如果我查看CommunicationManager类的Android Studio中的详细信息,我会得到以下视图,并看到Shadow $ _klass与Perflib具有相同的值(568)。见这里:

enter image description here

PerfLib控制台日志:

当我调用" getTotalRetainedSize()"时,perflib输出显示ClassObj返回的Number。

enter image description here

Eclipse Memory Analyzer: enter image description here

但是在Eclipse Memory Analzyer的左侧我可以看到以下内容: enter image description here

1 个答案:

答案 0 :(得分:0)

我知道如何从Perflib到Android Studio的价值观。我仍然不知道Eclipse Analyzer的功能。

如何从Android Studio获取值:

  1. 获取ClassObj(s)
  2. 检查此ClassObj的硬引用,并获取与ClassObj属于同一类的所有硬引用。获取该实例并计算TotalRetainedSize,如果有更多,则将它们加起来。
  3. 如果没有硬参考,请使用浅尺寸作为保留尺寸。
  4. 代码:

    for(int i = 0; i < listOfClassObj.size(); i++){
       ClassObj clazz = listOfClassObj.get(i);
       ArrayList<Instance> list = clazz.getHardReferences();
    
       long retainedValue = 0;
    
       if(list.size() > 0){
           for(int x = 0; x < list.size(); x++){
               Instance inst = list.get(x);
               String instanceStr = inst.toString();
               if(instanceStr.substring(0, instanceStr.indexOf("@")).contentEquals(clazz.getClassName())){
                   retainedValue += inst.getTotalRetainedSize();
               }
           }
       }else{
           retainedValue  = clazz.getShallowSize();
       }
    }