这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
Dalvik虚拟机
Dalvik虚拟机(Dalvik Virtual Machine) 简称Dalvik VM或是DVM。Dalvik虚拟机就是专门为了Android平台开发的,运行在Android运行库中。
DVM和JVM的不同
| 不同点 | DVM | JVM |
|---|---|---|
| 架构 | VM基于寄存器设计,不需要大量指令来支持。指令简洁快捷。可以说是以指令空间大小换时间大小。 | JVM基于栈设计,读写数据是从栈中获取。因此需要的指令更多,导致速度慢,在移动设备上影响性能。 |
| 字节码不同 | DVM中会有dx工具将.class文件转换为.dex文件。执行顺序:.java->.class->.dex | Java SE程序最终编译成.class文件并打包成jar文件。通过.class文件和Jar文件获取对于字节码。执行顺序:.java->.class->.jar |
| 有限内存中支持同时运行多个进程 | DVM优化支持运行多个进程。Android应用每个都是一个DVM且都是一个独立进程空间。可以做到各个应用之间相互隔离 | 无 |
| 创建和初始化 | 应用由Zygote负责创建和初始化,创建应用时执行fock。对于只读系统库,所有应用的DVM和Zygote是一起共享的。 | 无 |
| 共享机制 | 不同应用之间在运行可以共享相同类,拥有高效率。 | JVM机制不存在共享机制,不同程序运行彼此都是独立的。即使使用同样的类,但都是单独加载和运行无法共享使用。 |
| JIT编译器 | DVM早期不使用JIT编译器。自从Android2.2版本开始使用JIT编译器 | JVM使用JIT编译器 |
DVM和JVM的主要区别在于架构不同、执行字节码不同、DVM可在一定内存中同时运行多个进程、DVM由Zygote创建和初始化、DVM有共享机制、DVM不采用JIT编译器。
ART虚拟机
ART虚拟机(Android Runtime Machine)是Android4.4发布,用于替代Dalvik虚拟机。在Android5.0版本默认都采用ART,也预示着Dalvik虚拟机被淘汰退出历史舞台。
ART和DVM的不同
| 不同 | ART | DVM |
|---|---|---|
| 编译 | ART系统在安装应用时会进行一次AOT,简称为预编译。将字节码预先编译成机器码并储存到本地。应用运行不需要执行编译,提供运行效率 | DVM字节码通过JIT编译器转化为机器码,其应用运行效率低。 |
| 位数 | ART支持64位并兼容32位 | DVM只支持32位 |
| GC机制 | ART垃圾回收机制有过优化,采用多种垃圾回收方案:Concurrent Mark Sweep、Concurrent Partial Mark Sweep、Concurrent Sticky Mark Sweep、Marksweep + Semispace | 采用标记清除Mark-Sweep |
| 堆空间划分 | 运行时堆空间划分不同 | 无 |
总结
了解DVM和ART后可以大概知道为什么会有DVM和ART以及它们和JVM有哪些不同。在Android开发中为了能在移动硬件设备平台上去运行应用程序,在JVM的基础上做了”阉割“处理后有了DVM使得Android系统能够支持运行Java编写的应用程序。而后为了优化DVM的性能和运行效率,进一步升级完善而诞生出ART。关于Android虚拟机相关知识,这篇文章无法以偏概全只能当做入门基础介绍来讲。DVM和ART更多深入底层技术和应用在虚拟机中如何运行和加载过程知识需要更多篇幅展开说说。