在Android Logcat中GC_FOR_MALLOC,GC_EXPLICIT和其他GC_*的含义是什么?

Ran*_*ku' 63 android garbage-collection logcat

如果您看到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
Run Code Online (Sandbox Code Playgroud)

Rob*_*ert 122

GC_FOR_MALLOC表示GC已被触发,因为堆上没有足够的内存来执行分配.可能在创建新对象时触发.

GC_EXPLICIT表示已明确要求收集垃圾收集器,而不是由堆中的高水位标记触发.发生在整个地方,但最有可能是一个线程被杀死或者绑定器通信被取消.

还有其他几个:

GC_CONCURRENT当堆已达到要收集的特定数量的对象时触发.

GC_EXTERNAL_ALLOC意味着VM正在尝试减少用于可收集对象的内存量,以便为更多不可收集的内容腾出空间.

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

  • 经验.我在Android平台源代码中做了很多工作,我指导那些构建自己的Android设备的公司,我已经培训了近千人用于Android(包括设备和应用程序)的软件开发. (10认同)

jfr*_*z42 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

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

在Honeycomb之前,位图在VM外部分配(例如,Bitmap.createBitmap()在外部分配位图,只在本地堆上分配几十个字节).外部分配的其他示例适用于java.nio.ByteBuffers.

暂停时间

如果它是并发GC事件,则会列出两次.一种是在GC之前暂停,一种是在GC大部分完成时暂停.例如paused 3ms+5ms

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

  • 只是想要确认外部堆没有[在HoneyComb中更长时间存在](https://groups.google.com/d/msg/android-platform/dp6GsUiBynQ/j8B3HksRmC8J).它们现在分配在DVM堆上. (2认同)

Ran*_*ku' 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;
Run Code Online (Sandbox Code Playgroud)