ある意味でGC_FOR_ALLOC
は、より深刻ですGC_CONCURRENT
。これGC_FOR_ALLOC
は、割り当て要求を満たすのに十分な空きメモリがなかったため、ガベージコレクションが必要だったのに対しGC_CONCURRENT
、GCが実行されているように感じたことを意味します。これは、通常、空きメモリの量が割り当て後の特定のしきい値。
ただし、 AGC_FOR_ALLOC
自体はアプリケーションの問題の兆候ではありません。
- Androidアプリケーションは、アプリケーションがますます多くのメモリを必要とするときに(ある程度まで)大きくなる小さなヒープから始まり、
GC_FOR_ALLOC
ヒープのサイズを大きくする前に実行されます。この場合GC_FOR_ALLOC
、完全に正常です。
- 並行GCがメモリを解放する時間よりも速くメモリを割り当てる場合、それ
GC_FOR_ALLOC
は避けられません。また、並行GCがメモリを解放できるよりも速くメモリを割り当てることには、本質的に問題はありません。
Androidでのより深刻なタイプのGCはGC_BEFORE_OOM
、です。これは、割り当て要求が失敗した後GC_FOR_ALLOC
でも、アプリケーションヒープが許可されている範囲まで大きくなったときに実行されます。これが発生すると、最後の手段として、Dalvikはメモリの割り当てを最後に試行する前にSoftReferencesも解放しようとします。それが失敗した場合は、OutOfMemory例外をスローします。
このロジックのコードを知りたい場合はtryMalloc()
、dalvik.git / vm / alloc/Heap.cppにあります。
とにかく、気にしないのであれば、logcatの出力を確認することが、ガベージコレクションの問題をデバッグするための最も効率的な方法であるとは思えません。発生している具体的な問題はわかりませんが、DDMSのAllocation Trackerなどのツールを調べて、ツールを使用してヒープダンプを分析しましたhprof-conv
か?(開始するには、たとえばhttp://android-developers.blogspot.se/2011/03/memory-analysis-for-android.htmlを参照してください。)