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

Android垃圾收集器是否在运行时暂停其他应用程序?,android,performance,garbage-collection,Android,Performance,Garbage Collection,我发现了一些关于Android垃圾收集器的信息,这些信息对我来说是矛盾的 Android开发者指南中说: 安卓3.0是该平台的第一个版本,旨在运行于 单核或多核处理器体系结构。各种各样的 Dalvik VM、仿生库和其他地方的更改增加了支持 用于多核环境中的对称多处理。这些 优化可以使所有应用程序受益,即使是那些 单螺纹。例如,对于两个活动内核,一个单线程 如果Dalvik垃圾被丢弃,应用程序可能仍然会看到性能提升 收集器在第二个内核上运行。系统将为此作出安排 自动地。” 好的,现在另一件事 根

我发现了一些关于Android垃圾收集器的信息,这些信息对我来说是矛盾的

Android开发者指南中说:

安卓3.0是该平台的第一个版本,旨在运行于 单核或多核处理器体系结构。各种各样的 Dalvik VM、仿生库和其他地方的更改增加了支持 用于多核环境中的对称多处理。这些 优化可以使所有应用程序受益,即使是那些 单螺纹。例如,对于两个活动内核,一个单线程 如果Dalvik垃圾被丢弃,应用程序可能仍然会看到性能提升 收集器在第二个内核上运行。系统将为此作出安排 自动地。”

好的,现在另一件事

根据这个链接: android使用标记和扫掠的方式

Dalvik垃圾收集器的当前策略是保持标记 位,或表示某个特定对象正在运行的位 “可到达”,因此不应进行垃圾收集、分离 从其他堆内存

如果我们检查标记和扫描如何在此链接上工作: ,我们可以看到:

标记和扫描方法的主要缺点是 正常的程序执行被挂起,而垃圾 收集算法运行。特别是在 与人类用户交互或必须满足以下条件的程序 实时执行约束。例如,交互式 使用标记和清除垃圾收集的应用程序成为 周期性无反应


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

完全独立是不可能的:垃圾收集器和程序使用相同的内存,并且必须以某种方式进行通信。甚至“无暂停”“地面军事系统,像Azul的(顺便说一句,这是一个很好的读物:),有技术暂停。Dalvik可能(纯粹的猜测,基于传闻证据和IBM、Sun和Oracle等公司在过去15年中可能投入JVM的资源)落后于JVM中发现的最新技术数年,因此我怀疑暂停时间会更长。

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

姜饼和更高版本的Dalvik VM使用的是大部分并发部分收集垃圾收集器,暂停时间通常在5毫秒左右。因此,是的,GC通过停止其他应用程序来影响它们,但是并发GC算法能够将这些暂停最小化

你应该看看:

一般来说,垃圾收集理论解释如下:

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

  • 增量和并发垃圾收集器旨在通过 将他们的工作与主程序中的活动交织在一起。增量垃圾收集器 在不连续的阶段执行垃圾收集循环,允许在两个阶段之间执行程序 每个阶段(有时在某些阶段)

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