您的位置:首页 > 移动开发 > Android开发

为什么ART虚拟机会消耗更多的内存

2014-06-21 23:40 295 查看
今天听到消息说,Google正式放弃Dalvik的维护工作。尽管Google之前已经透露了Android新一代虚拟机ART的计划,Dalvik维护工作停止的消息还是让我感到兴奋。毕竟,年老Dalvik的已经不适应移动设备的需求——解释执行的效率(包括Just-in-time)以及垃圾收集带来的动画卡滞等问题都饱受诟病。新一代虚拟机ART正在试图解决这些问题。通过Google AOSP释放出来的代码,我们能够看到ART的雏形,也看到Google持续改进的步伐。我更关注ART的内存管理设计,因为这部分内容和Android应用开发、Framework开发密切相关,作为一位优秀的Android程序员应该了解这方面的知识。今天的话题是ART虚拟机的内存消耗。

一些Android开发人员已经注意到,同一款应用在ART上运行比在Dalvik上更耗资源。内存消耗过大轻则影响性能,重则影响稳定性,如OOM导致的程序崩溃。一些在Dalvik上运行良好的程序在ART上可能导致很差的用户体验,Android程序员需要解决这些遗留问题。当我们试图解决问题之前,我们需要先了解问题的根源。

Dalvik诞生于设备内存较小的时代,为了抑制Heap过快增长,它采用了尽可能多触发GC的策略。这些频繁触发的GC大部分是GC_FOR_ALLOC(STW类型的GC,运行时应用所有线程都要停下来),从而让用户感受到动画卡滞。ART采取的策略是空间换时间,放宽Heap增长的限制,尽可能减少STW-GC。此外,由于ART默认的GC是CMS,Heap碎片问题进一步加剧了内存的消耗。因此,从理论上来讲ART虚拟机消耗更多内存的问题目前无解——除非Google调整策略(个人认为几乎没有可能),抑或是Google提供新的GC算法在时间和空间之间寻找更好的平衡点。通过Google近期
的AOSP代码更新可以了解到,Google在试图引入一种compact-GC来抑制Heap中碎片。

在内存消耗问题上,除了期盼Google的改进,应用开发人员难道就束手无策么?当然不是。通过进一步了解ART的GC设计细节,我们可以调整应用对象分配的行为,从而让GC更高效的工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息