Android应用程序运行在Dalvik/ART虚拟机上。但是Dalvik也算是一个Java虚拟机,但是它们之间仍有区别。
Jvm、Dalvik对比
java虚拟机 | Dalvik虚拟机 |
---|---|
java虚拟机基于栈,基于栈的机器必须使用指令来载入和操作栈上数据 | Dalvik虚拟机基于寄存器 |
java虚拟机运行的是java字节码。(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar获取相应的字节码) | Dalvik运行的是自己专属的.dex字节码格式。(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据) |
- | 一个应用对应一个Diavik虚拟机实例,独立运行 |
基于栈和基于寄存器是什么意思?
基于栈:
基于栈的虚拟机,每一个运行的线程,都有一个独立的栈。栈中记录了方法调用的历史,每有一个方法调用,栈中就会多一个栈帧。最顶部的栈帧,成为当前栈帧。
基于寄存器:
寄存器是CPU的组成部分。寄存器是有限存储容量的高速存储部件。它可以用来暂存指令、数据和地址。基于寄存器的虚拟机,是将指令和数据存储分别存储在指令寄存器和数据寄存器中。
其结果是,由于基于寄存器,Dalvik虚拟机的指令数比Jvm虚拟机指令数、数据移动次数明显减少。
Dalvik:
Dalvik是Google公司自己设计用于Android平台的虚拟机。它可以支持已转换为 .dex格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式。应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码。
ART (Android Runtime)
Android在4.4版本引入,在5.0之后默认使用了ART的虚拟机。
ART 的机制与 Dalvik 不同,Dalvik执行的是dex字节码,ART执行的是本地机器码。
在Dalvik下,及时编译会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,ART使用设备自带的dex2oat工具来编译应用,dex中的字节码就会预先编译成本地机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速。
ART优缺点:
优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。
缺点:
1.机器码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%(不过在应用包中,可执行的代码常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是代码只有 6.9 MB。)
2.由于多做了预编译的过程,应用的安装时间会变长。
但是从Android N开始,Android启用了AOT,解释执行和JIT混合技术,解决了安装时间慢的问题。