Android Logcat中的GC_FOR_MALLOC,GC_EXPLICIT和其他GC_ *是什么意思?

如果你看到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 

GC_FOR_MALLOC意味着GC被触发,因为堆中没有足够的内存来执行分配。 可能会在创build新对象时触发。

GC_EXPLICIT意味着垃圾收集器已被明确要求收集,而不是被堆中的高水位标记触发。 发生在所有的地方,但最有可能当一个线程被杀害或绑定器通信被取消。

还有一些其他的:

GC_CONCURRENT当堆已达到一定数量的对象时触发。

GC_EXTERNAL_ALLOC表示虚拟机试图减less用于可收集对象的内存量,为更多不可收集的空间腾出空间。

更新:在更高版本的Android中,第一个事件发生了名称更改。 现在被称为“GC_FOR_ALLOC”。 还有一个新的事件,尽pipe在现代手机中非常罕见: GC_BEFORE_OOM意味着系统运行的内存非常低,并且执行了最终的GC,以避免调用低内存杀手。

Dalvik垃圾收集器消息的另一个地方是video: Google I / O 2011:Android应用程序的内存pipe理

演讲约14分钟,他分解了信息格式。 (顺便说一句,这个video在debugging内存泄漏方面有非常好的信息)

粗略地说,格式为[Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

原因

罗伯特/尤库已经给了这些信息的意义。

金额释放

例如freed 2125K

自我解释

堆统计

例如47% free 6214K/11719K

这些数字反映了GC运行之后的情况。 “47%免费”和6214K反映了当前的堆使用情况。 11719K代表总堆大小。 从我可以告诉的是,堆可以增长/缩小,所以如果达到这个限制,你不一定会有OutOfMemoryError。

外部内存统计

external 7142K/8400K

注意:这可能只存在于Android之前的Honeycomb版本(3.0之前)。

在Honeycomb之前,位图被分配到虚拟机的外部(例如,Bitmap.createBitmap()从外部分配位图,只在本地堆上分配几十个字节)。 其他外部分配的例子是java.nio.ByteBuffers。

暂停时间

如果是并发GC事件,则会有两次列出。 一个是在GC之前暂停,一个是在GC完成时暂停。 例如, paused 3ms+5ms

对于非并发GC事件,只有一个暂停时间,通常要大得多。 例如paused 87ms

我也在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;