虚拟机之Jvm、dalvik、art联系和区别

一、了解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混合模式的运行环境。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值