ART虚拟机用预编译和更聪明的垃圾回收取代了Dalvik的即时编译,内存管理更有效率,应用启动速度通常快上一截。它俩本质上是两代虚拟机,Android 5.0以后ART正式成为默认运行时,Dalvik成了历史,下面从内存管理和启动速度这两个核心维度拆开讲清楚。
Android ART和Dalvik虚拟机内存管理区别在哪?
内存管理是两者的根本分歧点,Dalvik是Android 4.4之前的主力,它靠即时编译(JIT)吃饭应用每次运行,代码都要在运行时被翻译成机器码,ART从Android 5.0开始转正,改用提前编译(AOT)和应用启动后的混合编译,这个区别直接影响了内存里的东西怎么放、怎么收。
垃圾回收机制:一个“偷懒式清理”,一个“勤快式整理”
Dalvik的垃圾回收(GC)采用标记-清除算法,而且它在回收时存在一个明显短板:一旦内存碎片多了,GC就得暂停应用线程,早年用Android手机经常感觉卡一下,大半是Dalvik正在翻垃圾,它的回收过程就像你在堆满杂物的房间里找东西,找到没用的就扔出去,但扔完地面还是乱的。
ART的GC设计要讲究得多,它引入了并发标记清除和压缩GC,大部分回收动作都在后台线程进行,不再动不动就暂停整个应用,更关键的是,ART会自动整理内存碎片,把零散的对象挪到一起,相当于不仅扔垃圾,还把房间重新摆整齐,下次放新东西时不用东塞西塞。
行业共识认为,ART的GC停顿时间比Dalvik缩短了一个数量级,反映到实际手感上就是界面刷新不容易掉帧。
内存分配策略:对象摆放的“整齐度”不同
Dalvik的堆内存分配偏向简单粗放,对象地址跳来跳去,碎片化问题需要频繁靠GC兜底,ART则引入了一个细节:它把对象分配按大小分成了多个“篮子”,大对象和小对象分开管理,这样分配时的查找成本更低,内存利用率更高。

拿一个实际场景说明:你在手机上开一个带很多图片的新闻App,Dalvik环境下,App不断创建图片对象再释放,堆空间很快变得像蜂窝煤一样千疮百孔,GC被迫频繁启动,ART环境下,因为对象分类存放且定期压缩,可用内存块更连续,GC的工作量也就小了。
下表把两者的内存管理差异列清楚:
| 对比项 | Dalvik | ART |
|---|---|---|
| 编译方式 | 即时编译(JIT) | 提前编译(AOT)+ 混合编译 |
| 垃圾回收算法 | 标记-清除,有较大停顿 | 并发+压缩,停顿极短 |
| 内存碎片处理 | 基本不管 | 自动整理压缩 |
| CPU开销 | 运行时持续消耗 | 安装时集中消耗 |
| 内存占用 | 初期低,后期波动大 | 整体更平稳 |
内存占用的实际表现:别只看“启动时”
很多人误以为ART因为要加载预编译代码,内存占用一定比Dalvik高,ART预编译的机器码直接放在oat文件里,运行时不需要像Dalvik那样额外分配内存来保存解释器状态,多数情况下,ART的稳定态内存占用反而更低,尤其是长时间使用后差距更明显,Dalvik虽然在冷启动那一下看起来轻巧,但用久了堆内存碎片累积,GC反复折腾,总和占用会悄悄涨上去。
ART虚拟机启动速度快吗?为什么比Dalvik快?
直接回答:应用启动速度,ART明显快于Dalvik,这里的“启动”指应用从点图标到界面可交互的时间,不是指设备开机时间,设备冷启动反而可能因为ART的预编译机制稍慢一点,但这笔账算在安装环节。

预编译让“临阵磨枪”变成“早就背好台词”
Dalvik时代的应用启动流程是:冷启动应用时,Dalvik虚拟机要一边读类文件一边把字节码翻译成机器码,即时编译的开销全被算在启动时间里,就好比一个演员临上台才看到剧本,边背台词边演,不卡才怪。
ART的AOT机制在应用安装时就完成了机器码翻译,生成的oat文件被直接映射到内存里执行,启动时CPU不用再做解释编译,省下了这段时间,业内专家指出,ART的AOT策略让大多数应用的冷启动速度比Dalvik快20%到30%,上海一家移动应用测试机构的公开测评也验证过这个趋势。
但有两个反直觉的点
第一,应用安装时间变长了,ART在安装时要把整个应用代码编译一遍,所以装大型游戏时,你能明显感觉到进度条转得比Dalvik时代久,这是把启动时间挪到了安装环节,不是凭空消失。
第二,老设备上ART可能不如Dalvik轻快,ART的预编译文件要占更多存储空间,设备内置存储不足时,读取oat文件反而造成I/O瓶颈,近年来的知乎讨论和贴吧反馈中,不少用户把“老手机刷回Android 4.4更流畅”归因于Dalvik的解释执行更省存储资源,不过这属于硬件跟不上新机制的极端情况。
Android 7.0之后的混合编译再次提速
纯粹AOT的缺点是安装慢,纯JIT的缺点是启动慢,Android 7.0开始ART用了混合编译:应用首次安装只做轻量JIT,之后设备在充电和空闲时自动把高频代码编译成AOT,这次调整让启动速度不再依赖安装时的全量编译,兼顾了安装体验和运行效率,到了Android 12前后,ART的配置文件引导编译机制已经非常成熟,热门应用基本能做到“点开即进”。

实际选择中,Dalvik和ART该怎么看?兼容性和存储空间怎么取舍?
现在新手机出厂都是ART,讨论“选哪个”更多是玩机爱好者刷机时的纠结,如果你手里有一台老设备,想从Android 4.4刷到5.0以上,需要想清楚两件事。
- 存储空间至少预留2GB以上:ART预编译生成的oat文件往往比原APK大不少,系统分区和Data分区都得有富余。
- 应用兼容性优先考虑ART:Android 5.0以后的新版应用基本都按ART标准优化,强行用Dalvik版本反而可能触发新代码不兼容的问题。
从整个生态看,Dalvik已经被ART完全取代,现在谈“区别”只是为了理解Android系统的演进逻辑,ART的代价是安装时的编译开销,收益是日常启动速度和长时运行的流畅度,对普通用户而言,ART是更划算的选择。
Android ART和Dalvik虚拟机常见问题解答
ART虚拟机还能切换回Dalvik吗?
不能,Android 5.0之后,ART是系统唯一的运行时,Dalvik的代码和接口已经被彻底移除,想体验Dalvik只能把系统刷回Android 4.4或更低版本,但那样会失去新版应用支持。
ART内存管理比Dalvik好在哪里?
好在两点:一是GC停顿时间短,应用不容易卡顿;二是堆内存自动压缩,碎片化问题大幅改善,简单说,Dalvik像频繁打扫但从不整理抽屉的家,ART则每次清扫后还把东西分门别类放好。
为什么有人觉得Dalvik运行老应用更流畅?
这是因为老应用体积小,Dalvik的即时编译开销有限,而ART的预编译文件反而占用更多存储和I/O带宽,在存储速度慢的老设备上,ART的负担可能大于收益,但只要换一块快一点的闪存芯片,ART的优势就能正常发挥出来。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/917445.html


评论列表(1条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于环境下的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!