2012-06-29 29 views
24

現在、Androidアプリでガベージコレクションの問題を調査中です。GC_FOR_ALLOCが他のGCメッセージ(GC_CONCURRENTなど)よりも大きな問題を示しているかどうか不思議です。メモリ使用量を調べるときにGC_FOR_ALLOCを「深刻」にしますか?

私の理解から、GC_CONCURRENTはガベージコレクタで何をすべきかを実行しています。ヒープは特定の制限に達している、より良いメモリを清掃してください。

GC_FOR_ALLOCは、オブジェクトを作成しようとしていて、それを行うメモリがない場合、さらに深刻なことが起こっていることを示しています。

GCメッセージの優先度または「重大度」レベルはありますか?

意味で
+0

あなたはhttp://stackoverflow.com/questions/895444/java-garbage-collection-log-messagesを読んでいますか?受け入れられた答えで参照されているリンクはあなたを助けるかもしれません – kommradHomer

+0

@kommradHomer応答のおかげでありがとうが、それはGCスウィープを行うdalvik仮想マシンであるため、ここでは当てはまりません。私はまだリンクが有益であると感じました。 –

答えて

53

GC_FOR_ALLOCGC_CONCURRENTがちょうどGCは、通常ので、実行しているように感じたことを意味し、一方、割り当て要求を満たすのに十分な空きメモリが、そうガベージコレクションが必要だった、そこにいなかった意味するのでGC_FOR_ALLOCが、GC_CONCURRENTよりも深刻です割り当て後に空きメモリの量が特定のしきい値より低くなりました。

GC_FOR_ALLOC自体がしかし、あなたのアプリケーションに問題の兆候ではありません。

  • Androidアプリケーションは、アプリケーションがより多くのメモリを必要とする場合(ポイントまで)成長し、小さなヒープで開始し、ヒープのサイズを増やす前にGC_FOR_ALLOCが実行されます。この場合、GC_FOR_ALLOCは完全に正常です。
  • 同時GCがメモリを解放する時間よりも速くメモリを割り当てると、GC_FOR_ALLOCは不可避です。また、同時GCがメモリーを解放するよりも速くメモリーを割り振ることに本質的に間違ったものはありません。

Android上でGCのより深刻な種類が割り当て要求もGC_FOR_ALLOC後に失敗したときに実行され、アプリケーション・ヒープは、あることを許可されているとして大きな成長してきたときGC_BEFORE_OOM、です。これが起きると、最後の手段として、Dalvikはメモリの割り当てを最終的に試みる前にSoftReferencesを解放しようとし、OutOfMemory例外をスローできない場合にもSoftReferencesを解放しようとします。

あなたはこのロジックのコードを見て好奇心旺盛であれば、あなたは気にしないならば、それは、とにかくdalvik.git/vm/alloc/Heap.cpp

tryMalloc()であり、私はlogcat出力を見ていることに最も効率的な方法であることを疑いますガベージコレクションの問題をデバッグします。 DDMSの割り当てトラッカーなどのツールを調べて、hprof-convツールの助けを借りてヒープダ​​ンプを分析しましたか? (開始するには、たとえばhttp://android-developers.blogspot.se/2011/03/memory-analysis-for-android.htmlを参照してください)

+0

お返事ありがとうございます。私のアプリはしばらくの間野生で出てきており、私たちはそれに微調整をしています。大きなオーバーヘッドの1つは、GCが4秒のウィンドウ内で30回まで実行されていたことです。それは本当に過度に見えた。いくつかの最適化では、GCは6回実行されますが、FOR_ALLOCが唯一の呼び出しです。しかし、今はそれが理にかなっています。 –

関連する問題