在运行我的应用程序时,我得到了这样的日志:
GC_EXTERNAL_ALLOC freed 2K, 38% free 8772K/14087K, external 17480K/17998K, paused 87ms
GC_FOR_MALLOC freed 0K, 38% free 8772K/14087K, external 17480K/17998K, paused 67ms
GC_CONCURRENT freed 2125K, 47% free 6214K/11719K, external 7142K/8400K, paused 3ms+5ms
有人知道这些日志是什么意思吗?提前致谢!
- “GC_EXTERNAL_ALLOC”、“GC_FOR_MALLOC”和“GC_CONCURRENT”有什么区别。还有其他一些“GC”事件吗?
- “38% 免费 8772K/14087K”是什么意思?什么是“8772K”,什么是“14087K”?
- “外部 17480K/17998K”是什么意思?什么是“17480K”,什么是“17998K”?
谢谢!
最佳答案
另一个解释 Dalvik 垃圾收集器消息的地方是这个视频:Google I/O 2011: Memory management for Android Apps
在演示开始大约 14 分钟时,他分解了消息格式。 (顺便说一句,该视频在调试内存泄漏方面提供了非常好的信息)
大致的格式是[Reason][Amount Freed],[Heap Statistics],[External Memory Statistics],[Pause Time]
原因
Viktor/Robert 已经解释了 GC_CONCURRENT
、GC_FOR_MALLOC
、GC_EXTERNAL_ALLOC
。
还有:
GC_HPROF_DUMP_HEAP
- 如果您通过单击 DDMS 中的“转储堆”按钮或以编程方式转储堆GC_EXPLICIT
- 如果你调用 System.gc()
释放量
例如释放 2125K
不言自明
堆统计
例如47% 免费 6214K/11719K
这些数字反射(reflect)了 GC 运行后的情况。 “47% free”和 6214K 反射(reflect)了当前的堆使用情况。 11719K 代表总堆大小。据我所知,堆可以增长/缩小,因此如果达到此限制,您不一定会遇到 OutOfMemoryError。
外存统计
例如外部7142K/8400K
注意:这可能仅存在于 Honeycomb 之前的 Android 版本(3.0 之前)中。
在 Honeycomb 之前,位图分配给您的 VM 外部(例如,Bitmap.createBitmap() 在外部分配位图并且只在本地堆上分配几十个字节)。外部分配的其他示例是 java.nio.ByteBuffers。
暂停时间
如果是并发GC事件,会列出两次。一种是在 GC 之前暂停,一种是在 GC 大部分完成时暂停。
例如。 暂停 3ms+5ms
对于非并发 GC 事件,只有一个暂停时间,而且通常要大得多。
例如。 暂停 87 毫秒
关于安卓日志 'GC_EXTERNAL_ALLOC' 'GC_FOR_MALLOC',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550757/