web-dev-qa-db-ja.com

GC_FOR_MALLOC、GC_EXPLICIT、およびその他のGC_ *は、Android Logcat?

Androidログが表示されている場合、それらの多くが表示されている可能性があります。

それらが何を意味するか、それらを知ることはより良いメモリ割り当てを行うのに役立つかもしれません。

例:

 28470               dalvikvm  D  GC_FOR_MALLOC freed 665 objects / 239992 bytes in 71ms
 28470               dalvikvm  D  GC_FOR_MALLOC freed 673 objects / 240288 bytes in 87ms
 21940               dalvikvm  D  GC_EXPLICIT freed 4802 objects / 185320 bytes in 78ms
 28470               dalvikvm  D  GC_FOR_MALLOC freed 666 objects / 240536 bytes in 63ms
63

GC_FOR_MALLOCは、ヒープに割り当てを実行するのに十分なメモリが残っていないためにGCがトリガーされたことを意味します。新しいオブジェクトが作成されているときにトリガーされる場合があります。

GC_EXPLICITは、ヒープ内の最高水位標によってトリガーされるのではなく、ガベージコレクターが明示的に収集するように要求されたことを意味します。あちこちで起こりますが、ほとんどの場合、スレッドが強制終了されるか、バインダー通信が切断されます。

他にもいくつかあります:

GC_CONCURRENTヒープが収集するオブジェクトの一定量に達するとトリガーされます。

GC_EXTERNAL_ALLOCは、VMが収集不可能なオブジェクトのためにスペースを空けるために、収集可能なオブジェクトに使用されるメモリ量を削減しようとしていることを意味します。

更新:以降のバージョンのAndroidでは、最初のイベントの名前が変更されました。現在は「GC_FOR_ALLOC」と呼ばれています。新しいイベントも利用できますが、最近の携帯電話では非常にまれです:GC_BEFORE_OOMは、システムのメモリが非常に少なく実行されていることを意味します。メモリキラー。

122
Robert

Dalvikのガベージコレクターメッセージについて説明している別の場所は、このビデオです: Google I/O 2011:Android Apps のメモリ管理

プレゼンテーションの開始から約14分で、彼はメッセージ形式を分析しました。 (ところで、そのビデオにはメモリリークのデバッグに関する非常に良い情報があります)

大まかに言うと、形式は[Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

理由

Robert/yukuはすでにこれらの意味についての情報を提供しました。

解放された量

例えば。 freed 2125K

自明

ヒープ統計

例えば。 47% free 6214K/11719K

これらの数値は、GC実行後の状態を反映しています。 「47%free」と6214Kは、現在のヒープ使用量を反映しています。 11719Kは、合計ヒープサイズを表します。私の知る限り、ヒープは拡大/縮小する可能性があるため、この制限に達しても必ずしもOutOfMemoryErrorが発生するわけではありません。

外部メモリ統計

例:external 7142K/8400K

注:これは、Android(3.0より前)のハニカム以前のバージョンにのみ存在する可能性があります。

Honeycombの前に、ビットマップはVMの外部に割り当てられます(たとえば、Bitmap.createBitmap()はビットマップを外部に割り当て、ローカルヒープに数十バイトのみを割り当てます)。外部割り当ての他の例はJava.nio.ByteBuffers。

一時停止時間

同時GCイベントの場合は、2回リストされます。 1つはGCの前の一時停止、もう1つはGCがほぼ完了したときの一時停止です。例えば。 paused 3ms+5ms

非並行GCイベントの場合、一時停止時間は1つだけであり、通常はそれよりはるかに長くなります。例えば。 paused 87ms

36
jfritz42

また、Androidソース、 dalvik/vm/alloc/Heap.h 。これが役に立つかもしれません。

typedef enum {
    /* Not enough space for an "ordinary" Object to be allocated. */
    GC_FOR_MALLOC,
    /* Automatic GC triggered by exceeding a heap occupancy threshold. */
    GC_CONCURRENT,
    /* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */
    GC_EXPLICIT,
    /* GC to try to reduce heap footprint to allow more non-GC'ed memory. */
    GC_EXTERNAL_ALLOC,
    /* GC to dump heap contents to a file, only used under WITH_HPROF */
    GC_HPROF_DUMP_HEAP
} GcReason;
27