繁体   English   中英

Android垃圾收集器释放内存

[英]Android Garbage Collector Freed Memory

我正在开发一个处理大量分配的应用程序(大约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上一直被调用。

引用这篇文章:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM