简述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的区别
- 对于移动设备来说,Java编译后的.class文件中存在了许多
冗余信息,因此Google在获取.class文件后利用了DEX工具将.class文件转化成.dex文件, 主要的操作有将所有的类文件重新排列,同时将常量值进行分解,消除其中的冗余信息,重新组合形成了一个常量池,所有类文件共享同一个常量池,使得相同的字符串和常量在DEX中只出现一次,.dex文件相对于.class文件更小,减少了I/O操作,提高了查找的速度。 - 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的区别。JVM是Java跨平台运行的基础,DVM是Android早期的Java虚拟机,进行了优化以适应移动设备。DVM和JVM的主要区别在于DEX文件和指令集。ART从Android 5.0开始替代DVM,采用AOT编译,提升运行效率,但会增加存储占用。ART的堆结构优化了内存分配和GC效率。
673

被折叠的 条评论
为什么被折叠?



