了解安卓 GC 消息
我在我的猫日志上有以下消息,
GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms
我试图理解最后一个值的总和。我已经在网站上检查了其他与GC相关的问题,它们要么有两个与并发GC关联的暂停,要么有一个与非并发GC相关的总暂停。为什么我有两个?我的应用是暂停了 5+9 毫秒还是 378 毫秒?究竟什么是总计?
我在我的猫日志上有以下消息,
GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms
我试图理解最后一个值的总和。我已经在网站上检查了其他与GC相关的问题,它们要么有两个与并发GC关联的暂停,要么有一个与非并发GC相关的总暂停。为什么我有两个?我的应用是暂停了 5+9 毫秒还是 378 毫秒?究竟什么是总计?
没有明确的答案,但从我得到的,GC_CONCURRENT是在单独的线程中运行的垃圾回收。这意味着,虽然总共可能需要 X 毫秒(在本例中为 378 毫秒)才能运行,但实际运行的线程不会被阻塞这么长时间。它只会在并发垃圾回收过程的开始和结束时被阻止一点(在您的示例中为5 + 9 = 14ms)
这种类型的垃圾回收由 JVM 自动触发,当它决定现在是这样做的好时机时(通常是当堆变得危险地高时)。其他类型的GC,如GC_EXPLICIT(如果我没有弄错名称)会在您执行
System.gc();
在代码中。对于这种类型的垃圾回收,它只会报告一次(如Y ms),在这种情况下,您的线程实际上将被阻塞一段时间,直到这种类型的GC进程完成。
GC_CONCURRENT
:在堆增长时触发。因此,它可以及时回收内存,因此堆不需要放大
GC_CONCURRENT
释放 456K
这部分告诉您此GC扫描释放了多少内存
GC_CONCURRENT
释放 456K, 19% 免费 2753K/3360K
此部分说明堆的百分比是空闲的,活动对象的大小以及堆的总大小。因此,在上面的示例中,19% 的 free,有 2753Kmemory 在使用中,总堆大小为 3360K。
日志的最后一部分告诉您 GC 花费了多长时间。在一个集合上,你会看到2次。一个在收藏的开头,一个在收藏的结尾。GC_CONCURRENT
对于并发 GC 事件,只有一个暂停时间,而且通常要大得多。例如,暂停 378 毫秒n
源:
https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages
另一个事情被清楚地解释的地方...