我正在处理一个处理大量分配的应用程序(大约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上一直被调用。
答案 0 :(得分:1)
引自this帖子:
接下来,ART团队致力于优化垃圾收集器(GC)。 而不是Dalvik的每个GC总共大约10ms的两次暂停, 你会看到一个,通常不到2毫秒。他们也并行化了 GC的部分运行和优化的收集策略 了解设备状态。例如,完整的GC只会在运行时运行 手机已锁定,用户互动响应不再 重要。对于敏感的应用程序,这是一个巨大的改进 丢帧。
作者在这里所说的是,在GC的背景下,ART驱动的设备将更加高效 - 无论是GC和#34;浪费"以及运行时释放的内存量。
对较低内存使用量的额外贡献可归因于此(这只是猜测):
也许是最重要的改进,ART现在编译你的 安装在用户设备上时应用于本机机器代码。 被称为提前编译,你可以期待看到大 由于编译器针对特定情况进行了调整,因此性能提升 体系结构(例如ARM,x86或MIPS)。这消除了需要 每次运行应用程序时进行即时编译。从而 您的应用程序安装需要稍长时间,但会启动 启动后,在Dalvik VM上运行时执行的任务越多, 如课程和方法验证,已经发生过。
由于ART会提前编译您的应用程序,因此可以扩展编译时间,从而使编译器能够更好地优化代码。