64

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
4

3 に答える 3

122

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

GC_EXPLICITは、ヒープ内の最高水準点によってトリガーされるのではなく、ガベージコレクターが明示的に収集するように要求されたことを意味します。いたるところに発生しますが、スレッドが強制終了されたとき、またはバインダー通信が切断されたときに発生する可能性があります。

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

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

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

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

于 2011-02-12T06:39:47.473 に答える
36

Dalvik ガベージ コレクター メッセージが説明されている別の場所は、次のビデオです: Google I/O 2011: Android アプリのメモリ管理

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

フォーマットは大まかに言うと、[Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

理由

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

解放された量

例えばfreed 2125K

一目瞭然

ヒープ統計

例えば47% free 6214K/11719K

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

外部メモリ統計

例えばexternal 7142K/8400K

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

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

休止時間

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

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

于 2011-08-03T22:12:47.837 に答える
27

これは、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;
于 2011-06-13T10:32:56.527 に答える