11

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

Android 开发者指南 说:

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

好的,现在是另一件事

根据此链接:Dalvik Virtual Machine Architecture android 使用标记和扫描方法。

Dalvik 垃圾收集器中的当前策略是保留标记位,或指示特定对象“可访问”的位,因此不应被垃圾收集,与其他堆内存分开。

如果我们在这个链接上检查标记和清除是如何工作的: 标记和清除垃圾收集算法 ,我们可以看到:

标记和清除方法的主要缺点是正常程序执行在垃圾收集算法运行时被挂起。特别是,在与人类用户交互或必须满足实时执行约束的程序中,这可能是一个问题。例如,使用标记和清除垃圾收集的交互式应用程序会周期性地无响应。

所以我现在的问题是,它是如何真正起作用的?垃圾收集器会在他工作时暂停一切,还是能够完全独立于其他活动处理器内核运行?

4

3 回答 3

11

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

你应该看看:

In general, the Garbage Collection theory [Garbage Collection Wiki] explains:

  • Stop-the-world garbage collectors completely halt execution of the program to run a collection cycle

  • Incremental and concurrent garbage collectors are designed to reduce this disruption by interleaving their work with activity from the main program. Incremental garbage collectors perform the garbage collection cycle in discrete phases, with program execution permitted between each phase (and sometimes during some phases).

  • Concurrent garbage collectors do not stop program execution at all, except perhaps briefly when the program's execution stack is scanned.
于 2013-02-13T00:56:13.627 回答
2

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

于 2013-02-12T20:07:29.163 回答
2

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

于 2013-02-12T20:08:58.470 回答