11

我正在开发一个处理大量分配的应用程序(大约 400 万个双打和 100 万个类)。我正在查看垃圾收集器日志,我看到不同设备释放的内存总量不同。

例如,我有一个 Moto X (2014),它最终释放了超过 312 MB。我还有一个 Droid Bionic 在相同的数据上运行相同的代码,平均释放 616 MB。两种设备最终的堆大小约为 50 MB。

为什么 Bionic 上的 GC 释放的内存比 Moto X 多得多?它们应该各自产生相同数量的垃圾。垃圾收集器的幕后发生了什么?Moto X 运行的是 Android 5.1,而 Bionic 运行的是 4.1.2。

编辑:我有四台设备正在释放大约 300 MB RAM:Moto X (2014)、Nexus 7 2013、Nexus 7 2012 和 Razr i。所有这四个都使用ART。Bionic 正在运行 Dalvik 运行时。这就是释放较少的原因吗?我注意到 GC_FOR_ALLOC 不会在 ART 中发生,但在 Dalvik 上一直被调用。

4

1 回答 1

1

引用这篇文章:

接下来,ART 团队致力于优化垃圾收集器(GC)。在 Dalvik 中,每次 GC 的两次暂停总共大约 10 毫秒,而您只会看到一次,通常在 2 毫秒以下。他们还对部分 GC 运行进行了并行化,并优化了收集策略以了解设备状态。例如,只有当手机被锁定并且用户交互响应不再重要时,才会运行完整的 GC。对于对丢帧敏感的应用程序来说,这是一个巨大的改进。

作者在这里所说的是,ART 驱动的设备在 GC 的上下文中将更加高效——无论是在 GC“浪费”的时间方面,还是在运行时释放的内存量方面。

对较低内存使用量的额外贡献可归因于此(这只是一个猜测):

也许最重要的改进是,当安装在用户设备上时,ART 现在会将您的应用程序编译为本机机器代码。被称为提前编译,随着编译器针对特定架构(例如 ARM、x86 或 MIPS)进行了调整,您可以预期会看到巨大的性能提升。这消除了每次运行应用程序时进行即时编译的需要。因此,您的应用程序安装时间会稍长一些,但启动时启动速度会更快,因为在 Dalvik VM 上运行时执行的许多任务(例如类和方法验证)已经发生。

由于 ART 会提前编译您的应用程序,因此可以延长编译时间,从而使编译器能够更好地优化您的代码。

于 2015-08-07T20:24:48.077 回答