Dalvik虚拟机
外观
Dalvik虚拟机是Google为Android操作系统设计的Java虚拟机实现,作为Android运行时环境的核心组件从2008年Android 1.0开始使用,直至2014年被ART取代。其名称来源于冰岛的一个名为Dalvík的小渔村。
技术架构[编辑 | 编辑源代码]
Dalvik虚拟机采用不同于标准JVM的设计架构:
寄存器架构[编辑 | 编辑源代码]
与基于栈的JVM不同,Dalvik使用基于寄存器的架构,特点包括:
- 指令集更紧凑
- 执行速度更快
- 减少指令数量(平均减少30%)
字节码格式[编辑 | 编辑源代码]
Dalvik不直接执行Java 字节码,而是处理转换后的.dex
(Dalvik Executable)格式:
- 通过dx工具将Java类文件转换为单个dex文件
- 支持多类文件合并优化
- 使用共享常量池减少内存占用
执行模型[编辑 | 编辑源代码]
Dalvik采用独特的运行时模型:
进程隔离[编辑 | 编辑源代码]
- 每个Android应用运行在独立的Linux进程中
- 每个进程包含一个Dalvik虚拟机实例
- 应用间通过Binder机制通信
内存管理[编辑 | 编辑源代码]
- 使用标记-清除(Mark-and-Sweep)垃圾回收算法
- 堆内存分为:
* 活跃堆(Active Heap) * 零碎堆(Zygote Heap)
JIT编译[编辑 | 编辑源代码]
从Android 2.2开始引入JIT编译器:
- 动态编译热点代码
- 性能提升2-5倍
- 代码缓存大小限制为64KB
性能优化[编辑 | 编辑源代码]
Dalvik包含多项优化技术:
预验证[编辑 | 编辑源代码]
- 在APK安装时进行字节码验证
- 减少运行时验证开销
- 使用
preverified
标记
线程模型[编辑 | 编辑源代码]
- 主线程(UI线程)与工作线程分离
- 通过Handler机制实现线程通信
- 全局JNI引用表管理
代码示例[编辑 | 编辑源代码]
以下展示Dalvik字节码与Java字节码的差异:
Java源码:
public int add(int a, int b) {
return a + b;
}
标准JVM字节码:
iload_1
iload_2
iadd
ireturn
Dalvik字节码:
add-int v0, v1, v2
return v0
历史演进[编辑 | 编辑源代码]
Dalvik的主要版本演进:
- 2008 - Android 1.0:初始版本
- 2009 - Android 1.5:性能优化
- 2010 - Android 2.2:引入JIT
- 2014 - Android 4.4:引入ART作为可选运行时
- 2015 - Android 5.0:完全由ART取代
实际应用[编辑 | 编辑源代码]
Dalvik虚拟机的设计直接影响Android开发:
- 应用启动时间优化
- ProGuard代码混淆兼容性
- 多dex支持机制
- Android NDK本地代码交互