JVM:ART与DVM

概述

每一个应用程序都对应着一个虚拟机实例,他们提供了对对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要的功能。Java虚拟机称为JVM,Android虚拟机称为DVM,其中D代表了Dalvik,在Android5.0以后引入了ART,对DVM又做了进一步的优化。

JVM与DVM

相同点:

  1. 都表现执行
  2. 都是每一个进程运行一个虚拟机实例,并运行一个单独的程序。

不同点

  1. DVM执行的是.dex文件,JVM执行的.class文件。多个.class文件可以合成一个.dex文件,该过程中会将冗余的信息去掉,执行起来更高效。
  2. DVM是基于寄存器的虚拟机,具有存取快,指令数少的特点
  3. JVM是基于栈的虚拟机,程序在运行时,会对栈上进行频繁的读取和写入,所以DVM会比较快
  4. JVM的堆是Java堆,而DVM的堆则分成A(Active)堆和Z(Zygote)堆。在进程启动时预加载的类,资源和对象是在Z堆中存储的,除此之外的所有对象都是在A堆中存储的。这样设计的目的是:
    因为Android通过fork方法创建到一个新的gygote进程,为了尽可能的避免父进程和子进程之间的数据拷贝,fork方法使用写时拷贝技术,写时拷贝技术简单讲就是fork的时候不立即拷贝父进程的数据到子进程中,而是在子进程或者父进程对内存进行写操作时是才对内存内容进行复制,Dalvik的gygote堆存放的预加载的类都是Android核心类和java运行时库,这部分内容很少被修改,大多数情况父进程和子进程共享这块内存区域。通常垃圾回收重点对Active堆进行回收操作。

ART与DVM

  1. ART是在5.0中引用的,DVM执行的.dex文件,而ART则是执行的是本地机器码。apk解压出来的.dex文件加上其他资源文件和.so库等。在apk安装的过程会把.dex文件编译成本地机器码。之后每次打开该应用,执行的都是本地机器码。
    ART这种方式效率更高,启动更快,除了首次安装会慢些,因为需要编译成机器码。
    
    

    总结