What do GC_FOR_MALLOC, GC_EXPLICIT, and other GC_* mean in Android Logcat?
android, garbage-collection, logcat
Solution
GC_FOR_MALLOC means that the GC was triggered because there wasn't enough memory left on the heap to perform an allocation. Might be triggered when new objects are being created.
GC_EXPLICIT means that the garbage collector has been explicitly asked to collect, instead of being triggered by high water marks in the heap. Happens all over the place, but most likely when a thread is being killed or when a binder communication is taken down.
There are a few others as well:
GC_CONCURRENT Triggered when the heap has reached a certain amount of objects to collect.
GC_EXTERNAL_ALLOC means that the the VM is trying to reduce the amount of memory used for collectable objects, to make room for more non-collectable.
Update: There has been a name-change of the first event in later versions of Android. It's now called "GC_FOR_ALLOC". There is also a new event available, although very rare in modern phones: GC_BEFORE_OOM means that the system is running really low on memory, and that there is a final GC performed, in order to avoid calling the low memory killer.
Problem
If you see the Android logs, you may see a lot of those things. What do they mean, knowing those may help us doing better memory allocations. Example: ``` 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 ```