Android垃圾收集器释放内存

时间:2015-07-30 18:46:56

标签: android memory 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上一直被调用。

1 个答案:

答案 0 :(得分:1)

引自this帖子:

  

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

作者在这里所说的是,在GC的背景下,ART驱动的设备将更加高效 - 无论是GC和#34;浪费"以及运行时释放的内存量。

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

  

也许是最重要的改进,ART现在编译你的   安装在用户设备上时应用于本机机器代码。   被称为提前编译,你可以期待看到大   由于编译器针对特定情况进行了调整,因此性能提升   体系结构(例如ARM,x86或MIPS)。这消除了需要   每次运行应用程序时进行即时编译。从而   您的应用程序安装需要稍长时间,但会启动   启动后,在Dalvik VM上运行时执行的任务越多,   如课程和方法验证,已经发生过。

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