2017-09-19 4 views
0

私のアプリケーションのメモリ消費量を分析しようとしました。だから私は.hprofファイルを持っています。狂ったことは、今私はほとんどすべてのソフトウェアで異なる結果を得ることです。Android memory analyze - 異なる保持メモリ結果

私はすべての値を比較するサンプルクラスを取った。保持されているメモリを除いて、すべての数字はほぼ同じです。

など。これらのツールに保持メモリの数:Eclipseのメモリアナライザで

  • オープニングHPROF:左インフォメーションで984
  • Eclipseのメモリアナライザ:アンドロイドStudioで456
  • オープニングHPROF:470
  • を読みますGoogleのPerflibを使用したHPROF:568

なぜこれらのツールに大きな違いがありますか?誰かに似たような経験がありましたか?

Androidのメーカーストック・ビデオ: enter image description here

私は、次のビューを取得し、シャドウの$ _klassは、Perflibでは同じ値(568)を持っていることがわかりCommunicationManagerクラスのアンドロイドStudioで詳細に見てみると。ここを参照してください:

enter image description here

PerfLibのコンソールログ:

のPerflib出力は、私が "getTotalRetainedSize()" を呼び出すときClassObjによって返される数を示しています。

enter image description here

Eclipseのメモリアナライザ:EclipseのメモリAnalzyerで enter image description here

しかし、左側に私は、以下を参照してくださいすることができます enter image description here

答えて

0

私は知っているが、どのように私を発見PerflibからAndroid Studioの値に到達することができます。 Eclipse Analyzerが何をしているのか分かりません。

のAndroid Studioから値を取得するにはどうすればよい:

  1. はClassObj(S)
  2. チェックこのClassObjのハード参照を取得し、ClassObjと同じクラスであるすべてのハードリファレンスを取ります。そのインスタンスを取ってTotalRetainedSizeを計算し、それがあれば合計します。
  3. ハードリファレンスがない場合は、シャローサイズを保持サイズとして使用します。

コード:

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(); 
    } 
}