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毫秒?到底究竟是什么?
没有明确的答案,但从我得到的,GC_CONCURRENT是一个在单独的线程中运行的垃圾收集.这意味着虽然可能需要总共X ms(在您的情况下为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花了多长时间.在一个GC_CONCURRENT
集合上,你会看到2次.一个在集合的开头,一个在最后.
对于n
并发GC事件,只有一个暂停时间,它通常要大得多.例如暂停了378ms
资源:
https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages
另一个清楚解释事情的地方......
http://www.youtube.com/watch?v=_CruQY55HOk
归档时间: |
|
查看次数: |
2004 次 |
最近记录: |