22

我刚刚在我的 android 手机上进行了从 ICS (4.0.4) 到 JB (4.1) 的自动更新,当我运行我的应用程序时它引入了多个垃圾收集调用:

WAIT_FOR_CONCURRENT_GC blocked 30ms

我在我的应用程序中流式传输视频,这些被阻止的 GC 调用几乎使我的延迟加倍,它们是什么意思?

4

2 回答 2

33

在几种情况下会发出该消息:

  • 当用户代码显式调用 gc() 并且 gc 已经在进行中时。
  • 当代码尝试进行分配但实际上内存中没有空间来容纳请求时,并且 gc 已经在进行中。

无论哪种情况,为了满足请求,第一步都是等待另一个线程中发生的热垃圾收集操作。一旦完成,线程就可以转移到更直接地要求它做的事情(这可能会导致进一步的垃圾收集)。

您可以在 platform/dalvik/vm/alloc 中找到显着的来源,尤其是 Heap.cpp 和 Alloc.cpp。

综上所述,我无法告诉您为什么您在 JB 中看到的停顿比在 ICS 中更多。

于 2012-07-18T20:05:00.623 回答
17

这次我们没有在 JB 之前登录。您的应用程序的线程总是必须阻塞等待任何并发 GC 完成才能进行收集,但 JB 是第一个您可以看到它们何时执行以及您可以看到它们必须等待多长时间的版本。

于 2012-07-31T16:28:11.137 回答