第2课_Android是栈式虚拟机吗
热度🔥:44 免费课程
授课语音
Android 平台的虚拟机介绍
Android 平台的虚拟机与传统的 Java 虚拟机(JVM)有所不同,主要有两种虚拟机形式:Dalvik 和 ART(Android Runtime)。这两种虚拟机都旨在为 Android 设备提供高效的应用运行环境。
1. Dalvik 虚拟机(Dalvik VM)
Dalvik 是 Android 平台早期使用的虚拟机,它是一个专门为移动设备优化的虚拟机,基于 寄存器 而非传统的栈式虚拟机。
1.1 Dalvik 的特点
寄存器结构:与传统的基于栈的虚拟机(如 JVM)不同,Dalvik 使用寄存器而非栈来执行字节码指令,这使得它在运行效率上有所提升。栈式虚拟机通过操作栈上的数据来执行字节码,而寄存器结构则直接使用寄存器存储和操作数据,减少了栈的操作。
优化移动设备:Dalvik 设计时考虑到了移动设备的硬件限制(如内存、CPU 性能、存储空间等)。它使用
.dex
格式(Dalvik Executable)来替代传统的.class
文件,目的是减小文件大小,提高运行时性能。多进程与内存管理:Dalvik 允许 Android 应用在多个进程中运行,每个应用有自己的虚拟机实例,从而实现了进程间隔离和更高的安全性。
JIT 编译器:Dalvik 使用即时编译(JIT,Just-In-Time)来提高执行性能。JIT 编译器在应用运行时将部分字节码动态编译为机器码。
2. ART(Android Runtime)
从 Android 5.0(Lollipop)开始,Android 平台逐渐转向使用 ART 作为默认的虚拟机,取代了 Dalvik。ART 提供了更高的性能和更好的内存管理。
2.1 ART 的特点
AOT 编译(Ahead-Of-Time Compilation):与 Dalvik 的 JIT 编译不同,ART 主要使用 AOT 编译。在应用安装时,ART 会将应用的字节码提前编译成机器码,这样应用在运行时就不再需要通过 JIT 编译,可以直接运行已编译的机器码,显著提高了应用的启动速度和性能。
改进的垃圾回收(GC):ART 提供了更高效的垃圾回收机制,减少了应用在运行时的停顿时间。垃圾回收是 Android 运行时性能的重要优化目标,ART 的改进使得内存管理更加高效。
更好的调试支持:ART 在调试和错误处理方面比 Dalvik 提供了更多的功能和改进。ART 支持更先进的调试工具,如更详细的堆栈信息和内存分析工具。
寄存器架构:与 Dalvik 相同,ART 也是基于寄存器架构的,不同之处在于 ART 在性能、内存管理和运行时优化方面做了更进一步的改进。
3. Dalvik 与 ART 的对比
特性 | Dalvik | ART |
---|---|---|
编译方式 | JIT(Just-In-Time)即时编译 | AOT(Ahead-Of-Time)提前编译 |
启动时间 | 较慢,需动态编译字节码 | 更快,安装时已编译为机器码 |
性能 | 性能较低 | 性能较高,尤其是在内存管理和垃圾回收方面 |
内存使用 | 相对较高 | 更低,优化了内存管理 |
垃圾回收 | 基于标记-清除和标记-整理的算法 | 提供改进的垃圾回收机制 |
启动应用时的延迟 | 存在延迟 | 减少了延迟,响应更快 |
4. 基于栈的虚拟机 VS 寄存器虚拟机
4.1 栈式虚拟机(如 JVM)
- 栈式虚拟机将数据存储在栈中,通过操作栈顶元素进行计算。
- 每个字节码指令通常会操作栈上的数据(例如,推送和弹出操作)。
- 这导致栈式虚拟机在某些情况下可能比寄存器虚拟机效率稍低,因为频繁的栈操作可能成为性能瓶颈。
4.2 寄存器虚拟机(如 Dalvik 和 ART)
- 寄存器虚拟机不使用栈来执行操作,而是直接操作一组寄存器。每个字节码指令操作指定的寄存器。
- 这种架构能够减少栈的操作,提高执行效率,特别适合资源受限的设备。
5. 总结
Android 的虚拟机最初使用 Dalvik,后来转向 ART。它们都不是基于栈的虚拟机,而是基于寄存器的虚拟机,这种架构设计可以更好地适应移动设备的资源限制。
- Dalvik:早期使用,基于 JIT 编译,性能较低。
- ART:Android 5.0 及以后的版本使用,采用 AOT 编译,性能和内存管理有显著改进。
两者在运行方式上有所不同,但都不是传统的基于栈的虚拟机,而是采用寄存器架构以提高效率和性能。