了解Android GC消息

时间:2013-04-03 11:09:42

标签: java android garbage-collection

我的catlog上有以下消息,

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms

我试图理解最后的总价值。我在网站上检查了其他与GC相关的问题,他们要么有两个暂停与并发GC相关联,要么一次总停顿为非并发GC。为什么我有两个?我的应用程序暂停了5 + 9毫秒还是378毫秒?到底究竟是什么?

5 个答案:

答案 0 :(得分:6)

没有明确的答案,但从我得到的结果来看,GC_CONCURRENT是一个在单独的线程中运行的垃圾收集。这意味着虽然可能需要总共X ms(在您的情况下为378)才能运行,但实际运行的线程将不会被阻塞那么长时间。它只会在并发垃圾收集过程的开始和结束时被阻塞一点(在你的例子中5 + 9 = 14ms)

这种类型的垃圾收集由JVM自动触发,当它确定它是一个好时机时(通常当堆已经变得非常危险)。其他类型的GC,如GC_EXPLICIT(如果我没有误认为名称)会在您执行时触发

的System.gc();

你的代码中的

。对于这种类型的垃圾收集,它只会报告一次(比如Y ms),在这种情况下,你的线程实际上会被阻塞一段时间,直到这种类型的GC进程完成。

答案 1 :(得分:5)

GC_CONCURRENT:当堆增长时触发。因此它可以及时回收内存,因此堆不需要放大

GC_CONCURRENT释放了456K

此部分告诉您此GC扫描释放了多少内存

GC_CONCURRENT释放456K,19%免费2753K / 3360K

这部分说明堆的多少%是空闲的,活动对象的大小和堆的总大小。所以在上面的例子中,19%的免费使用,有2753Kmemory在使用,总堆大小是3360K。

日志的最后一部分告诉您GC花了多长时间。在GC_CONCURRENT集合上,您会看到2次。一个在集合的开头,一个在最后。

对于n并发GC事件,只有一个暂停时间,它通常要大得多。例如。暂停了378ms

来源:

https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages

另一个清楚解释事情的地方......

http://www.youtube.com/watch?v=_CruQY55HOk

答案 2 :(得分:2)

从我看到的一些systraces看来,总计(378ms)并不能反映GC实际暂停你的应用程序的时间。它确实反映了垃圾收集花了多长时间。暂停时间是你应该注意的。

答案 3 :(得分:1)

看看这个question它解释了垃圾收集消息等 如果您需要更多信息,请观看谷歌关于内存管理的video

答案 4 :(得分:0)

http://www.youtube.com/watch?v=_CruQY55HOk

观看视频约17分钟。这家伙详细解释了logcat消息。

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms
GC_CONCURRENT : Jumps in because Heap is growing
19% free 2753K/3360K After this collection 19% of memory is free. Check the heap usage.paused 5ms+9ms Time taken to collect garbage. Total pause time is 378ms.