DalvikとARTのGCデバッグ

5259 ワード

本文は主にDalvikとARTの2種類のAndroid仮想マシンについて述べ,GC時にlog情報の意味を生み出し,分析しやすい.

一、Dalvik


1.1 GCの意味


Dalvik仮想マシン、GCごとにコンテンツフォーマットを印刷する:
D/dalvikvm:  , , , 


日本語版:
D/dalvikvm:  , , , 


意味解析
  • GC Reason(GCトリガ原因)
  • GC_CONCURRENT:割り当てられたメモリがある値に達すると、同時GCがトリガーされます.
  • GC_FOR_MALLOC:スタックにメモリ不足を割り当てようとしたときにトリガーされるGC;システムはアプリケーションを停止し、メモリを回収する必要があります.
  • GC_HPROF_DUMP_HEAP:HPROFファイルを作成してヒープメモリを分析する必要がある場合にトリガーされるGC;
  • GC_EXPLICIT:明示的にGCを呼び出す場合、例えばSystemを呼び出す.gc()など;
  • GC_EXTERNAL_ALLOC:APIレベルが10以下の場合のみ(新しいバージョンの割り当てメモリはすべてDalvikスタック上にある)
  • Amount freed GC回収メモリサイズ
  • Heap statsスタック上の空きメモリの割合(使用済みメモリ)/(スタック上の合計メモリ)
  • External memory stats APIレベルは10以下:(割り当てられたメモリ量)/(ゴミ発生の限界)
  • Pause time(一時停止時間)の大きいスタックでは、一時停止時間が大きくなります.同時停止時間には、ゴミ回収の先頭とゴミ回収の末尾に近い2つの停止が表示されます.

  • 1.2例


    例:D/dalvikvm:GC_CONCURRENT freed 2049K,65% free 3571K/9991K,external 4703K/5261K,paused 2ms+2ms意味:
  • GCトリガ原因:GC_CONCURRENT;
  • GCリリースメモリサイズ:2049 K;
  • スタック統計:スタック空きメモリは65%、使用済みメモリ:3571 K、スタック上の総メモリ:9991 K;
  • 一時停止時間:合計4 ms.

  • 1.3まとめ


    増加するログ情報に基づいて、増加したスタック統計(前例の3571 K/9991 K値)を観察し、この値が増加し続けるとメモリ漏れが発生する可能性がある.

    二、ART


    ARTのロゴはDalvikのロゴメカニズムとは異なり、通常は明示的に呼び出されていないGCsのロゴ情報は印刷されません.GCsで印刷されたロゴ情報は、いずれも実行が遅いと思われる情報であり、より正確には、GCが一時停止した時間が5 msを超えたり、GCが実行した総時間が100 msを超えたりする.appが一時停止した感知状態でなければGCなしでは遅いと考えられる.ただしGCsを明確に呼び出すとlog情報が記録されます.

    2.1 GCの意味


    ART仮想マシン、GCごとにコンテンツフォーマットを印刷する:
    I/art:   () AllocSpace Objects, ()  LOS objects, 
    
    

    日本語版:
    I/art:     ()    AllocSpace Objects, ()   LOS objects, 
    
    

    2.2 GC解析


    2.2.1 GC Reason

  • Concurrent:同時GCでは、appスレッドは一時停止されず、バックグラウンドスレッドで実行され、メモリ割り当ても阻止されません.
  • Alloc:スタックメモリがいっぱいになったとき、appがメモリを申請しようとすると、GCがトリガーされます.この場合、ゴミ回収はメモリを割り当てているスレッドで発生します.
  • Explicit:gc()などのゴミ回収を明確に呼び出す.dalvikと同様に、gcの明確な呼び出しはできるだけ避けなければならない.使用は推奨されません.プログラムのGCは、割り当てスレッドと不要なCPUサイクルをブロックするため、他のスレッドがプリエンプトリソースを取得するとjankを引き起こす可能性があります.
  • NativeAlloc:ゴミ回収は、nativeメモリが重すぎるためにトリガーされます.たとえば、BitmapsまたはRenderScriptによって割り当てられたオブジェクトなどです.
  • CollectorTransition:スタック遷移によってトリガーされる.コレクタ変換には、フリーリストのサポートスペースからポインタスペースへのすべてのオブジェクトのコピー、逆コピーが含まれます.現在、ゴミ回収器伝送は、低メモリデバイスのappプロセス状態遷移のみで発生し、1つの感知可能な一時停止状態から非一時停止感知状態に変換するか、または非一時停止状態から一時停止状態に変換することを含む.
  • HomogeneousSpaceCompact:整列空間圧縮とは、appが感知可能なプロセス状態を一時停止するまで移動したときに通常発生する空きリストから圧縮された空きリスト空間を指す.これは、メモリの使用量を削減し、スタックの破片を整理することが主な原因です.
  • DisableMovingGc:これは実際のGCトリガの原因ではありません.ただ、スタック圧縮が発生している間にGetPrimitiveArrayCriticalが使用されているわけではありません.移動コレクタに対する制限のため、GetPrimitiveArrayCriticalの使用は強く推奨されません.
  • HeapTrim:これはGCトリガの原因ではなく、ごみの回収がスタックの整理が完了するまでブロックされていることを示すだけです.

  • 2.2.2 GC Name

  • Concurrent mark sweep (CMS):完全なごみ回収器で、画像空間以外のすべてのごみを解放することができます.
  • Concurrent partial mark sweep:ほとんどのごみ回収器は、画像とzygote空間以外のすべてのごみを解放することができます.
  • Concurrent sticky mark sweep:一般的なゴミ回収器は、前回GCに関連付けられたオブジェクトのみを解放できます.このごみ回収器はより一般的に動作し、より低い一時停止時間がある.
  • Marksweep + semispace:非同時gc、コピーGCはスタック遷移および整列空間圧縮(スタックフラグメント整理)に使用される.

  • 2.2.3 GCその他パラメータ

  • Objects_freed:大きなオブジェクト空間から回収されたオブジェクトの数.
  • Size_freed:大きなオブジェクト空間から回収されたバイト数.
  • Large_objects_freed:大きなオブジェクト空間から回収されたオブジェクトの数.
  • Large_object_size_freed:大きなオブジェクト空間から回収されたバイト数.
  • Heap_stats:スタック上の空きメモリの割合(使用済みメモリ)/(スタック上の合計メモリ);
  • Pause_time:一時停止時間は、GCが実行中に参照オブジェクトが変更されたオブジェクトの数に比例します.現在、ARTのCMD GCは一度だけ停止し、GCの終わりの近くに現れている.移動GCにはGCのほとんどの期間に長い一時停止時間がかかります.

  • 2.3例


    I/art : Explicit concurrent mark sweep GC freed 104710 ( 7MB ) AllocSpace objects, 21 ( 416KB ) LOS objects, 33% free, 25MB/38MB , paused 1.230ms total 67.216ms
    意味:
  • GCトリガ原因:Explicit
  • GC名称:concurrent mark sweep GC
  • 解放対象個数:104701
  • リリースバイト数:7 MB
  • 大きいオブジェクトの個数を解放します:21
  • 大きいオブジェクトのバイト数を解放します:416 KB
  • ヒープ統計:ヒープ空きメモリ33%、使用済みメモリ:25 MB、総メモリ合計:38 MB
  • 一時停止時間:GC一時停止時間:1.230 ms、GC総時間:67.216 ms
  • 2.4まとめ

  • 大量のGC log情報がlogcatで見られると、スタック統計(例5 MB/38 MB)を調べることができる.この値が増加し続け、小さくなっていない場合は、メモリの漏洩が発生する可能性があります.
  • GCトリガ条件がAllocである場合、現在の環境はスタックメモリの上限に近づき、間もなくOOMが表示されます.

  • リファレンス


    http://developer.android.com/tools/debugging/debugging-memory.html