2013-02-12 64 views
11

我发现了一些关于Android垃圾收集器的信息,这些信息对我来说是矛盾的。Android垃圾收集器在运行时是否暂停其他应用程序?

的Android Devevelopers指南说:

Android 3.0的设计是对 无论是单核或多核处理器架构上运行的平台的第一个版本。 Dalvik虚拟机,仿生库和其他地方的各种 更改为多核环境中的对称多处理添加支持 。这些优化可以使所有应用程序都受益,即使那些单线程的应用程序也可以使用 。例如,对于两个活动核心,如果Dalvik垃圾收集器在第二个核心上运行,单线程 应用程序仍可能会看到性能提升。该系统将安排这 自动“

好了,现在其他的事情

根据此链接:The Dalvik Virtual Machine Architecture Android使用标志和清除的形式给出

目前的策略。 Dalvik垃圾收集器将保留标记 位或指示特定对象为 “可到达”并因此不应被垃圾收集的位,单独的来自其他堆内存的。

如果我们检查标记和清除是如何工作的此链接: Mark and Sweep Garbage Collection Algorithm ,我们可以看到这一点:

标记和清除方法的主要缺点是, 那当垃圾收集算法运行时,正常程序执行被暂停。特别是,这可能是与人工用户交互或必须满足实时执行约束的 程序中的问题。例如,使用标记和扫描垃圾回收的交互式应用程序 将周期性地变为无响应。

所以我现在的问题是,它是如何工作的?垃圾收集器在工作时是否暂停一切,还是他能够在另一个活动处理器内核上完全独立运行?

回答

11

Dalvik虚拟机在姜饼及以后版本使用与暂停时间通常在5毫秒的晴并发局部收集垃圾收集器。因此,GC正在通过阻止其他应用程序来影响其他应用程序,但并发GC算法能够最小化这些暂停。

你应该看看:

在一般情况下,垃圾收集理论[Garbage Collection Wiki]解释说:

  • 停止这世界个垃圾收集器完全停止执行程序运行收集周期

  • 增量和并发垃圾收集器通过 旨在减少这种破坏主程序交错他们与活动的工作。增量垃圾回收器 以离散阶段执行垃圾回收循环,允许在每个阶段(有时在某些阶段期间)在 之间执行程序。

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

完全独立是相当不可能的:垃圾收集器和程序使用相同的内存并且必须以某种方式进行通信。即使是“暂停”的GC,就像Azul(顺便说一句,一个好的阅读:http://www.artima.com/lejava/articles/azul_pauseless_gc.html),有技术暂停。 Dalvik很可能(纯粹的猜测,基于在过去15年中IBM,Sun和Oracle等公司在过去15年中涌入JVM的轶事证据和资源)落后于JVM中发现的最新技术,所以我怀疑这种停顿时间会更长。

2

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