了解Android GC消息

Sul*_*aim 15 java android garbage-collection

我的catlog上有以下消息,

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms
Run Code Online (Sandbox Code Playgroud)

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

Shi*_*gon 6

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

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

的System.gc();

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


Tha*_*var 5

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

GC_CONCURRENT 释放456K

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

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

这部分说明堆的多少%是空闲的,活动对象的大小和堆的总大小.因此在上面的示例中,19%free,使用了2753Kmemory,总堆大小为3360K.

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

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

资源:

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

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

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

  • 我知道所有这些,你的消息来源没有解决这个问题.我有三个时间值而不是两个我知道什么暂停了5ms + 9ms这个部分意味着但究竟是什么? (4认同)

Nic*_*aus 1

看看这个问题,它解释了垃圾收集消息等。
如果您需要更多信息,请观看来自谷歌的有关内存管理的视频