一.Dalvik虚拟机
Dalvik虚拟机,简称为DVM,是Google为Android平台专门开发的一款虚拟机,它运行在Android运行时的库中。
1.DVM和JVM的区别
需要注意的是,DVM并不是Java虚拟机,因为它并不是按照JVMM规范来实现的,除此以外,其和JVM之间的区别如下:
-
基于架构的不同
-
执行的字节码不同
-
DVM允许在有限的内存中同时运行多个进程
-
DVM由Zygote创建和初始化
-
DVM有共享机制
-
DVM早期没有使用JIT编译器
2.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
用来分配一些大对象。
网友评论