我的catlog上有以下消息,
GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms
我试图理解最后的总价值。我在网站上检查了其他与GC相关的问题,他们要么有两个暂停与并发GC相关联,要么一次总停顿为非并发GC。为什么我有两个?我的应用程序暂停了5 + 9毫秒还是378毫秒?到底究竟是什么?
答案 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
另一个清楚解释事情的地方......
答案 2 :(得分:2)
从我看到的一些systraces看来,总计(378ms)并不能反映GC实际暂停你的应用程序的时间。它确实反映了垃圾收集花了多长时间。暂停时间是你应该注意的。
答案 3 :(得分:1)
答案 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.