为什么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更高效的工作。
一些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更高效的工作。
相关文章推荐
- 为什么ios模拟器出现不了内存不足的问题,而真机会
- 为什么32位的win2003服务器系统支持超过4G甚至更多的内存
- libvirt网络分析之---为什么修改网络后虚拟机会断网
- C#创建一个线程为什么会消耗那么多的内存?
- 为什么系统调用消耗更多时间?
- SQL Server 2008的管理工具要消耗更多的内存
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- 内存学习——为什么需要虚拟内存
- 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的,请稍后重试
- 如何才能为你争取到更多的面试机会
- 为什么寄存器比内存快?
- 为什么寄存器比内存快?
- 解决fastboot刷机内存消耗问题
- ListView 性能优化——动态加载item中的内存消耗比较大的控件
- 详解为什么32位系统只能用4G内存
- 让Linux使用malloc申请更多的内存
- php查看运行时间、内存消耗
- 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗(1)
- c++ 虚拟继承,gcc内存分布情况
- 深入理解计算机系统-之-内存寻址(一)--存储管理机制(虚拟地址,线性地址,物理地址)