理解 Android 垃圾回收信息

15

我的记录中有以下信息,

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

我正在理解最后一个值“total”。我已经在网站上查看了其他与GC相关的问题,它们要么有与并发GC相关的两个暂停,要么有单个非并发GC的总暂停。为什么我有两个?我的应用程序是暂停了5+9毫秒还是378毫秒?“total”到底是什么意思?


5个回答

6

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

GC_CONCURRENT 释放了456K的内存。

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

GC_CONCURRENT 释放了456K, 占用了19%的2753K/3360K空间。

这一部分告诉您堆中有多少%的空闲空间、活动对象的大小和堆总大小。因此,在上面的示例中,19%的空闲空间中使用了2753K的内存,堆总大小为3360K。

日志的最后一部分告诉您GC花费的时间。在GC_CONCURRENT集合中,您将看到2个时间:一个是集合开始时,另一个是集合结束时。

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

来源:

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

另一个清晰解释的地方...

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


4
我知道所有的这些,你的来源没有回答我的问题。我有三个时间值而不是两个,我知道"paused 5ms+9ms"这部分的意思,但是"total"具体指什么呢? - Suleymanoglu Naim

6
没有确定的答案,但是根据我所了解的,GC_CONCURRENT 是一个在单独线程中运行的垃圾回收。这意味着虽然它可能需要总共 X 毫秒(在你的情况下为 378 毫秒)才能运行,但实际运行的线程不会被阻塞那么长时间。它只会在并发垃圾回收过程的开头和结尾被稍微阻塞一下(在你的例子中为 5+9=14 毫秒)。
JVM 会自动触发这种类型的垃圾回收,当它认为现在是执行垃圾回收的好时机时(通常是堆增长到危险的高度时)。其它类型的垃圾回收,比如 GC_EXPLICIT(如果我没记错名字的话),则是在你的代码中执行 System.gc(); 时触发的。对于这种类型的垃圾回收,它只会报告一次(如 Y 毫秒),在这种情况下,你的线程实际上会被阻塞直到这种类型的 GC 过程完成。

2

从我看过的一些系统跟踪信息来看,总时间(378毫秒)并不反映垃圾回收实际暂停您的应用程序的时间。它反映了垃圾回收所花费的时间。你应该查看暂停时间。


1

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


1
正如我在我的问题中所说,我已经检查了该网站上的类似问题。您链接的问题仍未回答我的问题。应用程序是否暂停了378毫秒?所有答案都假定一个单一的时间值,而我有两个。我也知道这个视频并观看了它。 - Suleymanoglu Naim

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.

1
我知道这个视频,它解释了“暂停5ms+9ms”的部分,这部分我已经知道了,但是不知道总共的378。文档中没有任何地方解释总时间。 - Suleymanoglu Naim
378毫秒是总暂停时间。 - Raghunandan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接