Android写了那么久了,Java语言用了好几年了,但是对JVM这一块的了解却还处在菜鸟的阶段。这主要是,平时工作中很少与底层虚拟机打交道。但是随着工作的深入,慢慢的发现底层还是有必要了解的,对工作中的一些问题的思考还是很有帮助的。
本系列旨在浅析JVM虚拟机的轮廓,让我们这些做上层应用的程序员对底层虚拟机也有个概念,对虚拟机的类加载、内存模型、垃圾回收与内存分配等机制有一定的了解,为解决日常开发中的困惑提供一点帮助。
废话不多说,马上开始。
一、JVM
JVM是Java Virtual Machine的缩写,中文翻译Java虚拟机。JVM的主要作用就是,将编译器编译后的Java字节码,转换为各个平台可运行的机器码。
当然JVM还做了很多事情,比如类加载、内存管理、IO等等。
下图很好的诠释了JVM的左右。
那么问题来了,都说Java是跨平台的,那么跨平台的是Java程序,还是JVM虚拟机呢?
还有疑惑,请看这里Java程序的跨平台性
二、Dalvik虚拟机
Dalvik是谷歌公司出的一款针对Android的虚拟机,专门为运行Android的程序打造的。Dalvik不是真正意义上的JVM,比如Dalvik运行的是dex文件,而JVM运行的是class字节码。class就是一个简单的类,而dex是一个文件,可能包含很多class文件,因此它可以将重复的常数、字符串保存在一个地方,从而节省空间。
还有一个区别是,JVM指令集是基于栈的,Dalvik是基于寄存器的。
基于栈的指令集,更紧凑,节省空间,对不同OS的兼容性会更好,但是load/store次数更多,访问内存次数会增多。基于寄存器的指令集虽然占用空间大,但是访问内存次数少,速度会相对快,但是对不同OS(确切的说是处理器架构)兼容不好,因此Android支持的是ARM架构。
除此之外,Dalvik和JVM有很多相似之处,如垃圾回收机制、类加载机制、内存模型等等。
三、ART虚拟机
ART是Android Runtime的缩写。在Android4.4之后推出了ART,在5.0之后,用ART代替了Dalvik虚拟机。
Dalvik使用即时编译技术(Just In Time,简称JIT),即每次启动应用都会进行编译转换为本地机器码,影响运行效率。而ART在第一次安装的时候,进行预编译(Ahead Of Time,AOT),提升了安装效率。
注:在Android的7.0之后,谷歌对ART又进行了优化,第一次安装不再编译,在运行时候编译,产生profile文件,在后续手机空闲时候,扫描app,找出常用APP,执行编译剩余的部分,解决占用空间和安装时间长的问题。
所以,ART和Dalvik的区别主要有以下几点:
1、应用运行效率,ART由于不需要在启动的时候编译,效率更快。
2、占用空间,ART需要将编译后的机器码保存会占用空间更大,一般大10-20%左右。
3、安装时间,由于在安装的时候ART编译,会导致安装时间更长。
参考链接:
1、JVM、Dalvik、ART 介绍
2、Dalvik 虚拟机和 Sun JVM 在架构和执行方面有什么本质区别?
3、JVM、Dalvik、ART傻傻分不清楚?
网友评论