众所周知,Android虚拟机不同于Java虚拟机,为了更高的编译速度,没有基于栈,而是基于寄存器。下面就来介绍整个Android虚拟机的演变过程。
自己做个目录。说一下主要的内容,不浪费阅读者的时间。主要讲了DVM到ART的转变。
- Dalvik虚拟机的简单介绍,它的运行时堆重点介绍了。
- ART虚拟机的简单介绍,它的运行时堆重点介绍了。
- GC垃圾回收因为太费时间了,没有说。
- 区别主要集中介绍了编译的方式的转变,例如:JIT、AOT的引入,以及即时JIT的引入。
Dalvik虚拟机
1.DVM与JVM的区别
- 基于的架构不同。JVM基于栈,需要的指令更多,导致速度变慢,由于移动设备性能有限,不是很合适。DVM是基于寄存器,指令的数量会减少,但是,指令的会变大,由于,数量减少了。代码数并不会增加很多。
- 执行的字节码不同。JVM的执行顺序:.java文件->.class文件->.jar文件。DVM执行顺序:.java文件->.class文件->.dex文件。
- DVM允许在有限的内存中同时运行多个进程。
- DVM由Zygote创建和初始化。
- DVM有共享机制。
- DVM早期没有使用JIT编译器。
- DVM的运行时堆
- DVM的运行时堆使用标记—清除算法进行GC,它由两个Space以及多个辅助数据结构组成,两个Space分别是ZygoteSpace和Allocation Space,Zygote进程fork第一个子进程之前,会把ZygoteSpace分成两个部分,原来的已经被使用的那部分对依旧叫ZygoteSpace,而未使用的那部分堆就叫Allocation Space,以后的对象都会在Allocation Space上进行分配和释放,它不是进程之间共享的。
- 除了这两个Space,还有以下数结构:
- Card Table:用于DVM Concurrent GC,当第一次进行垃圾标记后,记录垃圾信息。
- Heap Bitmap:有两个Heap Bitmap,一个用来记录上次GC存活的对象,另一个用来记录这次GC存活的对象。
- Mark Stack :DVM的运行时堆使用标记–清除算法进行GC,它用来遍历存活的对象。
ART虚拟机
ART虚拟机是Android 4.4发布的,用来替换Dalvik虚拟机,Android5.0之后默认采用ART虚拟机,DVM退出历史舞台。
- ART和DVM的区别
- 可以看看后面的总结。
- DVM是为32位CPU设计的,而ART支持64位并且兼容32位CPU。
- ART对垃圾回收机制进行了改进,比如更频繁地执行并行垃圾收集,将GC暂停由2次减少为1次。
- ART的运行时堆空间划分和DVM不同。
- ART的运行时维
- ART使用了多种垃圾收集方案,每个方案会运行不同的垃圾收集器,默认是采用CMS方案,该方案主要采用了sticky-CMS和partial-CMS。
- ART的运行时堆的空间也会有不同的划分,默认是由4个Space和多个辅助数据结构组成的,4个Space分别是Zygote Space、Allocation Space、Image Space和Large Object Space。
- Zygote Space、Allocation Space和DVM中的作用是一样的,Image Space用来存放一些预加载类,Large Object Space用来分配一些大对象(默认大小为12KB),其中Zygote Space和Image Space是进程间共享的。
- 除了四个Space,ART的Java堆中,还包括两个Mod Union Table,一个Card Table,两个Heap Bitmap,两个Object Map,以及三个Object Stack。
- ART的GC日志。
- 与DVM不同,ART会为那些主动请求的垃圾收集事件或者认为GC速度慢时才会打印GC日志。
DVM与ART区别总结
- 首先,为了提高运行的速度,在DVM早期的版本之中引入的JIT编译,对于多次运行的热点代码,会在本地生成机器码,这样在下次运行相同的逻辑代码的时候,直接使用机器码,可以提高运行速度。但是,需要注意的是,应用程序每次重新运行的时候,都需要重新编译这些代码,进行JIT编译。这是在Dalvik虚拟机的版本。
- 接着,到了ART虚拟机的版本,上面提到了,应用程序每次重新运行的时候,都需要重新编译这些代码。为了解决这个问题,引入了AOT(预编译),系统在安装应用程序的时候会进行一次AOT,将字节码预先编程成机器码,并且存储在本地,这样运行时自然效率大大提高。
- 然而,预先的编译,虽然提高了运行速度,但是,因为需要进行预编译,应用程序安装的时间大大提升了,而且编译好的机器码占用了大量的本地存储空间。Android7.0,在ART中加入了即时编译器JIT,作为AOT的一个补充,应用程序会在运行的时候,将热点代码编译成机器码。