Android垃圾收集器在运行时是否暂停其他应用程序?

时间:2013-02-12 19:54:20

标签: android performance garbage-collection

我发现了一些与我有矛盾的Android垃圾收集器的信息。

Android Devevelopers指南说:

  

Android 3.0是该平台的第一个版本,旨在运行   单核或多核处理器架构。各种各样   Dalvik VM,Bionic库和其他地方的变化增加了支持   用于多核环境中的对称多处理。这些   优化可以使所有应用程序受益,即使是那些应用程序   单线程的。例如,有两个活动核心,一个单线程   如果Dalvik垃圾,应用程序可能仍会看到性能提升   收集器在第二个核心上运行。系统将安排此事   自动“。

好的,现在是另一件事

根据此链接:The Dalvik Virtual Machine Architecture android使用mark和sweep aproach。

  

Dalvik垃圾收集器目前的策略是保持标记   位,或指示特定对象的位   “可达”,因此不应该是垃圾收集,分开   来自其他堆内存。

如果我们检查标记和扫描在此链接上的工作方式: Mark and Sweep Garbage Collection Algorithm ,我们可以看到:

  

标记和扫描方法的主要缺点是   垃圾时正常的程序执行被暂停   收集算法运行。特别是,这可能是一个问题   与人类用户交互或必须满足的程序   实时执行约束。例如,一个互动   使用标记和清除垃圾收集的应用程序变为   没有定期反应。

所以现在我的问题是,它是如何运作的?垃圾收集器在工作时是否会暂停所有内容,或者是否能够完全独立于其他活动处理器核心运行?

3 个答案:

答案 0 :(得分:11)

Gingerbread以及版本中的Dalvik VM正在使用大多数并发部分集合垃圾收集器,暂停时间通常约为5毫秒。因此,是的,GC通过停止它们来影响其他应用程序,但并发GC算法能够最小化这些暂停。

你应该看看:

一般来说,垃圾收集理论[Garbage Collection Wiki]解释说:

  • Stop-the-world 垃圾收集器完全停止执行程序以运行收集周期

  • 增量和并发垃圾收集器旨在减少此中断 将他们的工作与主程序的活动交织在一起。增量垃圾收集器 在离散阶段执行垃圾收集循环,允许程序执行 每个阶段(有时在某些阶段)。

  • 并发垃圾收集器根本不会停止程序执行,除非扫描程序执行堆栈时可能会短暂执行。

答案 1 :(得分:2)

完全独立是不可能的:垃圾收集器和程序使用相同的内存并且必须以某种方式进行通信。即使是“无动作”的GC,如Azul(顺便说一下,好读:http://www.artima.com/lejava/articles/azul_pauseless_gc.html),也有技术性的停顿。 Dalvik可能(纯粹的猜测,基于轶事证据和过去15年中由IBM,Sun和Oracle等人倾向于JVM的资源)多年来落后于JVM中的最新技术,所以我怀疑暂停时间会更长

答案 2 :(得分:2)

它不会暂停其他应用,它可能会暂停您的应用。标记和扫描不会 来停止所有处理,它只是最简单的方法。它可能有一些点暂停执行而其他地方没有。唯一真正的方法是查看Dalvik VM代码。在所有版本的Android中,我都不会指望它是相同的答案。