虚拟机之Jvmdalvikart联系和区别

Posted hymKing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟机之Jvmdalvikart联系和区别相关的知识,希望对你有一定的参考价值。

一、了解JVM

JVM: java virtual machine,缩写JVM,一种能够执行java bytecode的虚拟机器,本质上是一种软件实现,也可以理解成以一条运行java bytecode的底层程序。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

实际上,并不是仅有java源代码,能编译生成.class文件,也就是我们所说的字节码文件,下面是引用一张维基百科的图:

同样,python源码程序,也能最终编译成.class/.jar文件。

二、Jvm、dalvik虚拟机

先看一下JVM和android虚拟机的区别:

  1. JVM执行的是.class文件、Dalvik和ART执行的.dex文件。
  2. class文件有很多冗余信息,dex文件会做去冗余信息的优化。
  3. JVM是基于堆栈,Dalvik虚拟机是基于寄存器。

JVM是基于堆栈,Dalvik虚拟机是基于寄存器:

JVM是基于栈的指令会很紧凑,比如一个方法体的执行,需要经过一连串的指令来完成,JVM指令集是没有任何变量的,执行过程中,结合局部变量表,完成方法体指令的执行,过程中实际上需要和内存空间进行不断交互,这也是为什么一个java程序跑起来后,会占用很大的内存的原因。

JVM使用的指令只占一个字节,因而称为字节码。

Dalvik是基于寄存器的指令集(arm指令),需要指定源地址和目标地址(理解为变量声明),因此需要更多的指令空间。Dalvik的某些指令需要占用两个字节。

基于栈和基于寄存器的指令集,各有优势,一般来说,执行同样的功能,基于栈需要更多的指令(主要是load和store),而基于寄存器需要更多的指令空间。

下面是一段简单代码的jvm指令集:(紧凑、局部变量区内存交互 占用1个字节)

对应dalvik虚拟机的arm指令集:(指令比jvm指令少、占用不多于4个字节)

为什么Android没有直接使用Jvm虚拟机,而是使用Dalvik虚拟机,单从内存优化角度,就有非常必要的意义。

另外,Dalvik充分的利用了Linux进程的管理的特性,Android手机上,每启动一个应用就独立对应一个虚拟机,多个应用同时运行,就有多个虚拟机,都是独立的进程互不影响。

三、Dalvik和Art虚拟机

dalvik虚拟机:

Dalvik虚拟机,是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。

JIT(just in time)编译器,dalvik虚拟机使用JIT编译,每次apk应用运行时实时将一部分dex编译成机器码,然后被执行。

特点上:消耗更少的内存,占用更少的物理存储空间,类似于每次运行apk程序代码过程,都要从压缩包提取,虽然内存占用少了,物理存储空间少了,CPU的消耗就相对多了。

ART虚拟机:

ART,是Android Runtime的缩写,是一种在Android操作系统上的运行环境,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的(dex)字节码转换为机器码,是Android所使用的一种新的虚拟机。

ART和Dalvik的主要区别是:

Dalvik采用的JIT编译技术,ART采用的AOT编译技术,AOT(Ahead of time),ART同时也改善了性能、垃圾回收、应用程序出错以及性能分析。

在apk程序启动过程中:

若Dalvik虚拟机,JIT通过连续不断的性能分析来优化程序代码的执行,在程序运行的过程中,Dalvik虚拟机需要不断将dex字节码编译成机器码。

若ART虚拟机,ART引入了AOT预编译技术,在应用程序安装的过程中,AOT就将所有的dex字节码编译成了机器码,应用程序运行过程中,不需要实时的做编译工作,直接调用即可。

因此,ART极大的提升了应用程序的运行效率,同时也减少了手机的电量消耗,提供了移动设备的续航能力,在垃圾回收机制上,也有很大的提升。

为了保证向下兼容,ART使用了相同的Dalvik字节码文件(dex),即在应用程序目录下保留了dex文件供旧程序调用,然而.odex文件则替换成了可执行与可链接格式(ELF)可执行文件。一旦一个程序被ART的dex2oat命令编译,那么这个程序将会只通过ELF可执行文件来运行。因此,相对于Dalvik虚拟机模式,ART模式下Android应用程序的安装需要消耗更多的时间,同时也会占用更大的内部储存空间,用于储存编译后的代码,但节省了很多Dalvik虚拟机用于实时编译的时间,即运行的时候,效率会更高。

ART这种预编译模式,会造成安装耗时,在Android N实现了一个使用AOT、解释、JIT混合模式的运行环境。

以上是关于虚拟机之Jvmdalvikart联系和区别的主要内容,如果未能解决你的问题,请参考以下文章

虚拟机之Jvmdalvikart联系和区别

图解java虚拟机之内存区域

KVM虚拟机之网络配置

深入理解 Java 虚拟机之学习笔记

Java虚拟机之运行时数据区域

深入理解Java虚拟机之垃圾收集二