一、Java虚拟机
1. Java的是Java字节码。
传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序。
2. Java虚拟机基于栈架构。
程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间。
二、Dalvik虚拟机(Android 4.4以前)
1. Dalvik虚拟机虚拟机运行的是Dalvik字节码。
所有的Dalvik字节码由java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中,Dalvik虚拟机通过解析DEX文件来执行这些字节码。
2. Dalvik可执行文件体积更小
Android SDK中的dx工具负责将Java字节码转换为Dalvik字节码,并对Java类文件重新排列,消除在类文件中出现的所有冗余信息,从而减少了冗余和重复的解析。
因为一般情况下,Java类文件中包含多个不同的方法签名,如果其他的类文件引用改该类文件的方法,方法签名也会被复制到其类文件中,也就是,多个不同的类会同时包含相同的方法签名,同样的,大量的字符串常量在多个类文件中也被重复使用。这些冗余信息会直接增加文件的体积,也会严重影响虚拟机解析文件的效率。
3. Dalvik虚拟机基于寄存器架构。
数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。
三、ART虚拟机(Android 5.0后)
Dalvik虚拟机是执行的时候编译+运行,所以安装速度比较快,但是开启应用的时间较慢,应用占用空间小。(以空间换时间)
ART虚拟机是安装的时候就编译好,执行的时候就直接运行编译好的代码,所以安装速度比较慢,但是开启应用的时间快,占用空间较大。(以空间换时间)
apk包中除了一堆资源,还有一个重要文件classes.dex,此文件由java字节码优化打包而成,在Dalvik中,每次打开应用的时候,Dalvik会读取这个classes.dex并解释执行;而在ART环境下,当安装apk的时候,这个classes.dex文件就会被转换成本地机器码——后缀为oat的文件可直接供ART虚拟机使用,以后打开应用时直接读取oat文件执行即可。
#### YunSoul技术分享,扫码关注微信公众号##
-
——只要你学会了之前所不会的东西,只要今天的你强过了昨天的你,那你就一直是在进阶的路上了。