什么是Dalvik:
Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为
.dex
(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
每一个
Android
应用程序都在它自己的进程中运行,都拥有一个独立的
Dalvik
虚拟机实例。而每一个
DVM
都是在
Linux
中的一个进程,所以说可以认为是同一个概念。
什么是ART:
Android操作系统已经成熟,从Android4.4开始,Google的Android团队开始将注意力转向一些底层组件,其中之一是负责应用程序运行的Dalvik运行时。Google开发者已经花了两年时间开发更快执行效率更高更省电的替代ART运行时。 ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time (JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运 行。ART则完全改变了这套做法,在应用安装时就
预编译字节码到机器语言,即将中间代码静态编译成本地代码
,这一机制叫Ahead-Of-Time (
AOT
)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。
1. Dalvik与JVM的区别
(1)Dalvik指令集是
基于寄存器
的架构,执行特有的文件格式——
dex字节码
(适合内存和处理器速度有限的系统)。而JVM是
基于栈
的。相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些平台无关性,但是它在
代码的执行效率
上要更胜一筹。
(2)每一个Android 的App是
独立跑在一个VM中
的。因此一个App crash只会影响到自身的VM,不会影响到其他。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且
每一个 Dalvik应用作为一个独立的Linux进程执行
。
2. Dalvik与ART的区别
(1)在Dalvik下,应用每次
运行
都需要通过
即时编译器
(JIT)将字节码转换为机器码,即
每次都要编译加运行
,这虽然会使安装过程比较快,但是会
拖慢应用的运行效率。
而在ART 环境中,应用在
第一次安装
的时候,
字节码就会预编译(AOT)成机器码
,这样的话,虽然设备和应用的
首次启动(安装慢了)
会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。
(2)ART占用空间比Dalvik大(
原生代码占用的存储空间更大
,字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。
(4)
预编译
也可以明显改善
电池续航
,因为应用程序每次运行时
不用重复编译
了,从而减少了 CPU 的使用频率,降低了能耗。
(5)ART提供了更好的垃圾回收表现,将垃圾回收时,程序的暂停次数由两次(分析、清理)减少到一次;程序暂停时,并行的进行垃圾回收处理;回收新近分配的、生命期短的对象,垃圾回收器花费的时间更少
ART优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。
ART缺点:
1、更大的存储空间占用,可能会增加10%-20%。
2、更长的应用安装时间。