Android中的Dalvik和ART虚拟机

Dalvik

Dalvik虚拟机(Dalvik Virtual Machine),简称 DVM,是 Google 专门为 Android 平台开发的虚拟机,它运行在 Android 运行时库中。

DVM 与 JVM 的区别

  • 架构不同

    JVM基于栈架构,需要频繁地从栈上读写数据,因此需要更多的指令分派和内存访问次数,这样就会耗费不少 CPU 时间。

    DVM基于寄存器架构,数据的访问通过寄存器间的直接传递,相比基于栈的方式更快。

  • 执行的字节码不同

    传统的 Java 程序经过编译生成 Java 字节码保存在 class 文件中,JVM 通过解释 class 文件来运行程序。

    而 DVM 会将所有 class 文件转换成一个 dex 文件(存储 Dalvik 字节码),DVM通过解释 dex 文件来执行程序。

  • dex文件体积更小

    java字节码转换到Dalvik字节码的过程中,会用到dx工具。该工具会对所有的Java类文件中的常量池进行分解,消除其中的冗余信息,重新组成一个常量池。如下图所示:

    jar和dex的差异

  • DVM允许在有限的内存中同时运行多个进程

    DVM经过优化,允许在有限的内存中同时运行多个进程。在Android中的每一个应用都运行在一个DVM实例中,每一个DVM实例都运行在一个独立的进程空间。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

  • DVM由Zygote创建和初始化

    Zygote是一个DVM进程,同时也用来创建和初始化DVM实例。每当系统需要创建一个应用程序时,Zygote就会fock自身,快速的创建和初始化一个DVM实例,用于应用程序的运行。对于一些只读的系统库,所有的DVM实例都会和Zygote共享一块内存区域。

  • DVM有共享机制

    DVM拥有预加载-共享的机制,不同应用之间在运行时可以共享相同的类,拥有更高的效率。而JVM不存在这种共享机制,不同的程序都是彼此独立的,无法进行共享。

DVM的运行时堆

DVM的运行时堆主要由两个Space以及多个辅助数据结构组成,两个Space分别是Zygote Space(Zygote Heap)和Allocation Space(Active Heap)。Zygote Space用来管理Zygote进程在启动过程中预加载和创建的各种对象,Zygote Space中不会触发GC,所有进程都共享该区域,比如系统资源。Allocation Space是在Zygote进程fork第一个子进程之前创建的,以后的对象都会在Allocation Space上进行分配和释放。Allocation Space不是进程间共享的,在每个进程中都独立拥有一份。除了这两个Space,还包含以下数据结构:

  • Card Table:用于DVM Concurrent GC,当第一次进行垃圾标记后,记录垃圾信息。
  • Heap Bitmap:有两个Heap Bitmap,一个用来记录上次GC存活的对象,另一个用来记录这次GC存活的对象。
  • Mark Stack:DVM的运行时堆使用标记-清除(Mark-Sweep)算法进行GC,Mark Stack就是在GC的标记阶段使用的,它用来遍历存活的对象。

DVM运行时堆

ART

在Android5.0版本,ART(Android Runtime)虚拟机完全替代了DVM。

ART和DVM的区别

  • DVM中应用每次运行时,都要进行 JIT 编译(Just In Time Compilation,即时编译)。而在ART中,系统在安装应用程序时会进行一次AOT编译(Ahead Of Time Compilation,预编译),将字节码预先编译成机器码并存储在本地,这样应用程序每次运行时就不需要再编译了,但这也会造成应用程序的安装时间变长,所占存储空间变多。因此在Android7.0版本中,ART加入了 JIT 编译,作为AOT的一个补充,在应用程序安装时并不会将字节码全部编译成机器码,而是将热点代码编译成机器码,从而缩短应用程序的安装时间并节省了存储空间。
  • DVM只支持32位CPU,而ART支持64位并兼容32位CPU。
  • ART对垃圾回收机制进行了改进,比如更频繁地执行并行垃圾收集。
  • ART的运行时堆空间划分和DVM不同。

ART的运行时堆

ART的运行时堆主要由四个Space和多个辅助数据结构组成,四个Space分别是Zygote Space、Allocation Space、Image Space、Large Object Space。Zygote Space和Allocation Space的作用同DVM中的一致,Image Space用来存放一些预加载类,Large Object Space用来分配一些大对象,其中Zygote Space和Image Space是进程间共享的。辅助数据结构包括两个Mod Union Table、一个Card Table、两个Heap Bitmap、两个Object Map、三个Object Stack。

ART运行时堆


参考:

Android内存优化(一)DVM和ART原理初探 | BATcoder - 刘望舒 (liuwangshu.cn)


Android中的Dalvik和ART虚拟机
http://example.com/2023/09/13/Android安全/Android中的Dalvik和ART虚拟机/
作者
gla2xy
发布于
2023年9月13日
许可协议