简述JVM,DVM,ART

本文介绍了JVM、DVM和ART的区别。JVM是Java跨平台运行的基础,DVM是Android早期的Java虚拟机,进行了优化以适应移动设备。DVM和JVM的主要区别在于DEX文件和指令集。ART从Android 5.0开始替代DVM,采用AOT编译,提升运行效率,但会增加存储占用。ART的堆结构优化了内存分配和GC效率。

简述JVM,DVM,ART

JVM

JVM是Java Virtual Machine的缩写,JVM运行的操作系统之上,屏蔽了底层的实现差异,其本质是一个软件,是对计算机硬件层的软件抽象,使得Java程序编译后在JVM上面运行,实现“Write Once Run Anywhere”。与C语言编译后产生的汇编语言不同的是,Java编译后产生的是JVM字节码,然后JVM把字节码翻译成机器指令,因此JRE(JVM,Java核心库和支持软件)是分平台的。综上,JVM的作用就是把Java编译后的.class文件翻译成与平台对应的机器指令,实现跨平台运行。

DVM

DVM是Dalvik Virtual Machine的缩写,是Google在JVM的基础上针对移动设备做进一步的改动和优化,可以简单理解为Android平台的Java虚拟机。

JVM和DVM的区别

  1. 对于移动设备来说,Java编译后的.class文件中存在了许多
    冗余信息,因此Google在获取.class文件后利用了DEX工具将.class文件转化成.dex文件, 主要的操作有将所有的类文件重新排列,同时将常量值进行分解,消除其中的冗余信息,重新组合形成了一个常量池,所有类文件共享同一个常量池,使得相同的字符串和常量在DEX中只出现一次,.dex文件相对于.class文件更小,减少了I/O操作,提高了查找的速度。
  2. Dalvik的指令集是基于寄存器来实现的,而JVM是基于堆栈来实现的。这使得前者在速度上比后者更好,同时会减少CPU压力。

ART

编译器中有两个概念

  • JIT(Just In Time),类似于脚本运行,例如当应用使用Dalvik JIT编译器的运行过程为,JIT实时的将一部分Dalvik字节码翻译成机器指令,一边编译一边运行,好处在于更少的占用内存。
  • AOT(Ahead Of Time),这类似于程序的编译,在应用安装的过程中就将其编译成机器指令然后储存在设备中,这样每次运行时就不需要再次调用JIT编译器,好处是执行速度快的多。

ART是Android5.0之后用来代替Dalvik虚拟机的,Dalvik虚拟机采用的是JIT技术,为了提高Android设备的性能,所以ART采用了AOT技术,使得应用的启动速度更快,运行效率更高,缺点是比较占用空间,且由于安装的过程需要进行编译所以安装时间相对较长。

ART的堆结构相比于Dalvik有一定的改动,ART的堆主要组成包括Image Space、Zygote Space、Allocation Space和Large Object Space四个Space。其中Image Space、Zygote Space这两个为所有线程共享内存。Allocation Space和Large Object Space则拿来分配内存。

Large Object Space是用来分配内存给需要占用大内存的实例,数组。它需要满足一定条件才会分配

Zygote Space已经划分除了Allocation Space
分配对象是原子类型数组,如int[] byte[] boolean[]
分配的内存大小大于一定的门限值
当满足这三个条件后,就会分配Large Object Space中的内存。

在对ART的堆结构优化后,ART内存分配效率是Dalvik的8-10倍,GC效率是Dalvik的2-3倍。

参考文献:
简单聊聊JVM,DVM,ART
JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值