Android进阶(15)| Dalvik和ART

作者: yzbkaka | 来源:发表于2019-09-30 11:12 被阅读0次

    一.Dalvik虚拟机

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

    1.DVM和JVM的区别

    需要注意的是,DVM并不是Java虚拟机,因为它并不是按照JVMM规范来实现的,除此以外,其和JVM之间的区别如下:

    • 基于架构的不同

    • 执行的字节码不同

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

    • DVM由Zygote创建和初始化

    • DVM有共享机制

    • DVM早期没有使用JIT编译器

    2.DVM架构

    DVM架构图

    可以看出,首先Java编译器编译的.class文件经过DX工具转换为.dex文件,之后.dex工具文件由类加载器处理,接着解释器根据指令集对Dalvik字节码进行解释、执行,最后交于Linux处理。

    3.DVM运行时的堆

    DVM在运行时堆使用的是标记-清除算法来进行垃圾回收的。它的堆是由2个Space和多个辅助数据结构组成,2个Space分别是Zygote Space和Allocation Space:

    • Zygote Space
      主要是用来管理Zygote进程在启动过程中预加载和创建的各种对象,在Zygote Space中不会出发GC,同时在Zygote进程和应用程序之间共享Zygote Space。

    • Allocation Space
      在Zygote Space进程fork第一个子进程之前,会把Zygote Space分为2个部分,原来的已经被使用的那部分堆仍旧是Zygote Space,而未使用的那部分堆就叫做Allocation Space,以后的对象都会在Allocation Space上进行分配和释放。Allocation Space不是进程间共享的,每个进程中都独立拥有一份。

    DVM中数据结构如下:

    • Card Table
      用于DVM的Concurrent GC,当第一次进行垃圾标记后,记录垃圾信息。

    • Heap Bitmap
      有2个Heap Bitmap,一个用来记录上次GC存活的对象,另一个用来记录这次GC存活的对象。

    • Mark Stack
      DVM的运行时进行GC时用来进行标记的数据结构。

    二.ART虚拟机

    ART虚拟机是Android 4.4发布的,用来替换Dalvik虚拟机。在Android 5.0版本中默认采用了ART,DVM从此退出了。

    1.ART和DVM的区别

    (1) DVM中的应用每次运行时,字节码都需要通过JIT编译器编译为机器码;而在ART中,系统在安装应用程序时会进行一次AOT(预编译),也就是会将字节码预先编译为机器码并存储在本地,之后又改进为只在安装时将部分字节吗预先编译为机器码,剩余部分则会在运行中将热点代码编译为机器码。

    (2) DVM是为32位CPU设计的,而ART支持64位并且兼容32位。

    (3) ART对垃圾回收机制进行了改进。

    (4) ART的运行时栈空间划分和DVM有所不同。

    2.ART的运行时的堆

    ART采用的是多种垃圾收集方案,每个方案会运行不同的垃圾收集器,默认采用的CMS方案。ART的运行时堆的空间也会有不同的划分,默认是由4个Space和多个辅助数据结构组成的,这4个Space分别是:

    • Zygote
      与DVM中的作用是一样的。
    • Alloction Space
      与DVM中的作用是一样的。
    • Image Space
      用来存放一些预加载类,其和Zygote Space是进程间共享的。
    • Large Object Space
      用来分配一些大对象。

    三.DVM和ART的启动过程

    相关文章

      网友评论

        本文标题:Android进阶(15)| Dalvik和ART

        本文链接:https://www.haomeiwen.com/subject/yfvfpctx.html