面试:Art虚拟机和Davlik虚拟机简要对比
Android 4.4以后推出了ART虚拟机,它与Davlik虚拟机最大的不同在于,系统在安装应用时会对其进行预编译一次,将字节码转换成机器指令,以后每次启动不会重新编译,直接运行本地机器码。直接上图:Art与Davlik加载过程.pngJava虚拟机首先先来说一下java虚拟机,不管是Art虚拟机还是Davlik虚拟机,首先第一步需要得到.class字节码。Java虚拟机加载的是.class字节
Android 4.4以后推出了ART虚拟机,它与Davlik虚拟机最大的不同在于,系统在安装应用时会对其进行预编译一次,将字节码转换成机器指令,以后每次启动不会重新编译,直接运行本地机器码。
直接上图:
Art与Davlik加载过程.png
Java虚拟机
首先先来说一下java虚拟机,不管是Art虚拟机还是Davlik虚拟机,首先第一步需要得到.class字节码。
-
Java虚拟机加载的是
.class字节码
,所以需要将.java文件编译成.class文件; -
它是基于
栈结构
的,需要频繁的从栈上读取写入数据,耗费大量CPU,而且含有大量冗余信息,占用内存,显然对于内存要求挺高,并不适合内存容量相对较小的移动设备。
Davlik虚拟机
在Android4.4以下包括4.4使用的是Davlik虚拟机,所有程序都运行在虚拟机中,每一个应用程序就是Davlik虚拟机中的一个进程。
-
Davlik虚拟机加载的是
.dex文件
,.dex文件是由.class文件所生成,在SDK中有一个dex工具
,专门生成.dex文件
; -
它是基于寄存器的,数据访问是通过寄存器来直接传递的,相对速度较基于栈结构方式要快很多;
-
生成后的.dex文件有大量的冗余信息,内容过于臃肿,因此需要将其文件进行优化,利用SDK中
.dexopt工具
将.dex文件优化后最终得到.odex文件
,这一过程发生在编译的时候,最终得到是一个包含.dex的apk文件
; -
Davlik虚拟机特别勤劳,每次应用启动后,通过
JIT编译器
将.dex翻译成机器指令
,这一过程发生在程序运行过程中,并且每次启动运行都会重新翻译一次,在Android2.2时候引入了JIT编译器,它会将频率高的程序翻译归于热方法
,然后保存在内存中,下次就不会再重新翻译直接从内存中获取,一定程度上改善了运行慢的问题,但是还是不能与直接运行本地机器指令的ART虚拟机相比。
ART虚拟机
Android5.0开始,Google将Davlik虚拟机替换为Art虚拟机,大大改善了启动速度。
-
Art虚拟机加载的是
.oat文件
,即(本地机器指令
),当.java文件编译成.dex文件后,利用sdk中dexoat工具
将.dex文件生成.oat文件
,其实这个就是机器指令,这一过程主要在应用安装
的时候转换的,所以在安装应用时会耗费时间,下次启动后直接运行的已经编译好的本地机器码指令,大大提高了启动速度; -
应用程序仍然是一个apk文件
,只是与Davlik不同的是它在安装的时候已经将字节码翻译成机器指令,并不需要像Davlik一样每次运行程序再翻译,但这样生成的apk大小会比Davlik生成的apk大小大很多;
优缺点
优点
- Davlik虚拟机apk包占用内存小;
- Art虚拟机启动速度快;
缺点
- Davlik虚拟机启动速度慢,每次运行都会重新翻译一次;
- Art虚拟机apk占用内存大;
总结:
在Android使用Davlik虚拟机的时候,移动设备内存小,我们需要对内存格外控制,随着移动设备内存容量的增大,用户开始追求的是流畅度,所以应用占用内存多大相对于app的流畅度来说显得就很小了。
更多推荐
所有评论(0)