【问题标题】:What do GC_FOR_MALLOC, GC_EXPLICIT, and other GC_* mean in Android Logcat?Android Logcat 中的 GC_FOR_MALLOC、GC_EXPLICIT 和其他 GC_* 是什么意思?
【发布时间】:2011-02-12 05:41:06
【问题描述】:

如果您查看 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

【问题讨论】:

    标签: android garbage-collection logcat


    【解决方案1】:

    GC_FOR_MALLOC 表示由于堆上没有足够的内存来执行分配而触发了 GC。可能会在创建新对象时触发。

    GC_EXPLICIT 表示垃圾收集器已被明确要求收集,而不是由堆中的高水位标记触发。到处都会发生,但最有可能发生在线程被杀死或绑定通信被取消时。

    还有一些其他的:

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

    GC_EXTERNAL_ALLOC 表示 VM 正在尝试减少用于可收集对象的内存量,以便为更多不可收集对象腾出空间。

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

    【讨论】:

    • 谢谢!只是想知道您从哪里获得这些信息?
    • 经验。我在 Android 平台源代码方面做了大量工作,我指导构建自己的 Android 设备的公司,我已经培训了近千人进行 Android 软件开发(包括设备和应用程序)。
    • 我有一个列表视图,GC_CONCURRENT 经常出现在日志猫中。还有一些 GC_FOR_ALLOC。我应该担心这个吗?
    • Enigma,您应该查看绘制列表项的代码。日志消息表明您可能在每次绘制列表项时分配和释放内存。阅读 Mark Murphy 撰写的关于列表的系列文章。 androidguys.com/2008/07/14/fancy-listviews-part-one
    • 在我的日志中,我没有看到GC_FOR_MALLOC,但看到了GC_FOR_ALLOC。这是同一个事件,只是被重命名以删除 malloc() 名称引用,还是不同的事件?
    【解决方案2】:

    另一个解释 Dalvik 垃圾收集器消息的地方是这个视频:Google I/O 2011: Memory management for Android Apps

    在演示开始大约 14 分钟时,他分解了消息格式。 (顺便说一句,该视频在调试内存泄漏方面提供了非常好的信息)

    大致的格式是[Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

    原因

    Robert/yuku 已经提供了有关这些含义的信息。

    释放量

    例如freed 2125K

    不言自明

    堆统计

    例如47% free 6214K/11719K

    这些数字反映了 GC 运行后的情况。 “47% free”和 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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多