我发现了一些与我有矛盾的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 ,我们可以看到:
标记和扫描方法的主要缺点是 垃圾时正常的程序执行被暂停 收集算法运行。特别是,这可能是一个问题 与人类用户交互或必须满足的程序 实时执行约束。例如,一个互动 使用标记和清除垃圾收集的应用程序变为 没有定期反应。
所以现在我的问题是,它是如何运作的?垃圾收集器在工作时是否会暂停所有内容,或者是否能够完全独立于其他活动处理器核心运行?
答案 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中,我都不会指望它是相同的答案。