跳转到内容

Dalvik虚拟机

Dalvik虚拟机GoogleAndroid操作系统设计的Java虚拟机实现,作为Android运行时环境的核心组件从2008年Android 1.0开始使用,直至2014年被ART取代。其名称来源于冰岛的一个名为Dalvík的小渔村。

技术架构[编辑 | 编辑源代码]

Dalvik虚拟机采用不同于标准JVM的设计架构:

寄存器架构[编辑 | 编辑源代码]

与基于栈的JVM不同,Dalvik使用基于寄存器的架构,特点包括:

  • 指令集更紧凑
  • 执行速度更快
  • 减少指令数量(平均减少30%)

字节码格式[编辑 | 编辑源代码]

Dalvik不直接执行Java 字节码,而是处理转换后的.dex(Dalvik Executable)格式:

  • 通过dx工具将Java类文件转换为单个dex文件
  • 支持多类文件合并优化
  • 使用共享常量池减少内存占用

graph LR A[Java .class文件] --> B[dx工具] B --> C[classes.dex] C --> D[Dalvik虚拟机]

执行模型[编辑 | 编辑源代码]

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开发:

参见[编辑 | 编辑源代码]