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


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

Android Devevelopers指南说:

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

好的,现在另一件事

根据这个链接: Dalvik虚拟机架构 android使用mark和sweep aproach。

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

如果我们检查标记和扫描在此链接上的工作方式: 标记和扫描垃圾收集算法 ,我们可以看到:

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

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


12315
2018-02-12 19:54


起源



答案:


Dalvik VM中的 姜饼和更多 版本正在使用 主要是并发部分收集 垃圾收集器,暂停时间通常约为5ms。因此,是的,GC通过停止它们来影响其他应用程序,但并发GC算法能够使这些暂停最小化。

你应该看看:

一般来说,垃圾收集理论 [垃圾收集维基] 解释:

  • 停止这世界 垃圾收集器完全停止执行程序以运行收集循环

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

  • 并发垃圾收集器 根本不会停止程序执行,除非是在扫描程序的执行堆栈时。

11
2018-02-13 00:56





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


2
2018-02-12 20:07





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


2
2018-02-12 20:08