一、JVM、JRE、JDK
JVM:Java Virtual Machine。java虚拟机是一个翻译器,把Class字节码翻译成机器识别的代码语言。这是翻译java的基础,根据操作系统的不同翻译成不同操作系统的语言,最终调用操作系统上的函数。这是java跨平台的基础。
JRE:Java Runtime Environment。java运行环境,包含了JVM,除此之外还提供了很多的类库,这些是JRE提供的基础类库,实际是一些jar。这是开发java 的基础。
JDK提供java编译工具、调试工具、反编译工具、打包工具: javac(编译代码)、java、jar (打包代码)、javap(反编译<反汇编>)等。这个就是JDK。
所以,JRE是java运行基础,jdk提供工具支持,jvm提供翻译能力。
JVM的执行过程
Java 程序通过 javac 编译成 .class 文件,然后 JVM 将其加载到方法区,执行引擎将会执行这些字节码。执行时,会翻译成操作系统相关的函数,调用操作系统函数。
二、DVM
DVM:Dalvik Virtual Machine。
DVM实现了JVM规范,可运行在Android环境中,DVM和JVM有一些不同点:
1.JVM运行class字节码,DVM执行dex文件--dex文件是class文件压缩处理后的文件
2.JVM的指令集基于堆栈,DVM的指令集基于寄存器--寄存器相当于将局部变量表和操作数栈合并了
基于寄存器的虚拟机栈会更加高效一点,少了局部变量与操作数栈的交互过程。直接在寄存器中完成数据交互。
基于寄存器的虚拟机中没有操作数栈,但是有很多虚拟寄存器。
其实和操作数栈相同,这些寄存器也存放在运行时栈中,本质上就是一个数组。
与JVM相似,在DVM中每个线程都有自己的PC和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。
3.DVM从Android 2.2版本开始,支持JIT即时编译(Just In Time)。在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。直接编译成机器码。也就是解释执行+JIT。
三、ART
ART :Android Runtime
Android 4.4 中引入的一个开发者选项,也是 Android 5.0 及更高版本的默认 Android 运行时。ART相当于是DVM的升级版。
JVM执行class字节码,DVM执行dex文件,ART虚拟机执行的是本地机器码。
DVM在安装过程会执行odex优化,也就是将dex文件优化成odex
Android5.0:ART采用预先编译机制,在安装时对dex文件执行AOT预编译操作,采用dex2oat 工具将dex编译为oat本地机器码,这是个耗时的过程,所以实际上Android5.0后面的版本,安装过程就变慢了。
Android7.0:ART采用混编方式,安装过程不进行AOT预编译操作,在程序运行过程中,对经常访问的方法进行JIT,并记录到Profile配置文件中,在空闲时通过编译守护进程对Profile配置文件下的代码进行AOT预编译,等到运行时就直接使用执行。