Dav*_*d M 11 memory android garbage-collection android-runtime
我正在开发一个处理大量分配的应用程序(大约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上一直被调用.
引用这篇文章:
\n\n\n\n\n接下来,ART 团队致力于优化垃圾收集器 (GC)。\n Dalvik 中的每次 GC 不再有两次总计约 10 毫秒的暂停,\n 您\xe2\x80\x99 将只看到一次,通常不到 2 毫秒。他们还并行化了部分 GC 运行并优化了收集策略以了解设备状态。例如,仅当手机锁定并且用户交互响应不再重要时,才会运行完整的 GC。对于对丢帧敏感的应用程序来说,这是一个巨大的改进。
\n
作者在这里所说的是,ART 支持的设备在 GC 环境中将更加高效 - 无论是在 GC“浪费”的时间还是在运行时释放的内存量方面。
\n\n对较低内存使用量的额外贡献可以归因于此(这只是一个猜测):
\n\n\n\n\n也许最重要的改进是,当您的应用程序安装在用户\xe2\x80\x99s 设备上时,ART 现在会将您的\n 应用程序编译为本机机器代码。\n 称为提前编译,您可以期待看到较大的\n当编译器针对特定架构(例如 ARM、x86 或 MIPS)进行调整时,性能会得到提升。这样就无需在每次运行应用程序时进行即时编译。因此,\n 您的应用程序安装时间会稍长一些,但启动时\n 启动速度会更快,因为 Dalvik VM 上运行时执行的许多任务(例如类和方法验证)已经执行。
\n
由于 ART 会提前编译您的应用程序,因此可以延长编译时间,从而使编译器能够更好地优化您的代码。
\n