Android记录'GC_EXTERNAL_ALLOC''GC_FOR_MALLOC'

Ton*_*ony 25 logging android

在运行我的应用程序时,我有这种日志:

GC_EXTERNAL_ALLOC释放2K,38%免费8772K/14087K,外部17480K/17998K,暂停87ms
GC_FOR_MALLOC释放0K,38%免费8772K/14087K,外部17480K/17998K,暂停67ms
GC_CONCURRENT释放2125K,47%免费6214K/11719K,外部7142K/8400K,暂停3ms + 5ms

有谁知道这些日志是什么意思?提前致谢!

  1. 'GC_EXTERNAL_ALLOC','GC_FOR_MALLOC'和'GC_CONCURRENT'之间的区别是什么?还有其他'GC'事件吗?
  2. '38%免费8772K/14087K'是什么意思?什么是'8772K'什么是'14087K'?
  3. "外部17480K/17998K"是什么意思?什么是'17480K'什么是'17998K'?

谢谢!

jfr*_*z42 44

另一个解释Dalvik垃圾收集器消息的地方在此视频中:Google I/O 2011:Android应用程序的内存管理

在演示文稿大约14分钟后,他打破了消息格式.(顺便说一句,该视频在调试内存泄漏方面确实有很好的信息)

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

原因

维克多/罗伯特已经说明GC_CONCURRENT,GC_FOR_MALLOC,GC_EXTERNAL_ALLOC.

还有:

  • GC_HPROF_DUMP_HEAP - 如果通过单击DDMS中的"转储堆"按钮或以编程方式转储堆

  • GC_EXPLICIT - 如果你打电话给System.gc()

释放金额

例如 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

  • 很棒 - 这应该是公认的答案. (2认同)

Vik*_*tor 14

我也在寻找这些信息.

GC代表垃圾收集器,它在应用程序运行时收集未使用的对象.

    • GC_EXTERNAL_ALLOC:表示VM正在尝试减少可收集对象使用的内存量,以便为不可收集的对象腾出空间.
    • GC_FOR_MALLOC:表示GC已被触发,因为堆上没有足够的内存来执行分配.可能在创建新对象时触发.
    • GC_CONCURRENT:当堆已达到要收集的特定数量的对象时触发.
  1. 我猜测38%的免费意味着38%的堆未被使用.8772K将是堆上已用内存的大小,14087K将是堆的大小.
  2. 我不知道,对不起.

请注意,所有的这些信息是基于从后罗伯特上发布一个类似的问题在这里的计算器.所有信用(只要这是正确的)归罗伯特.