android 进阶解密 第十一章 Dalvik和ART
一.Dalvik虚拟机
1.DVM与JVM的区别:
①.基于架构不同:JVM基于栈架构,DVM基于寄存器架构。
②.执行字节码不同:
JVM执行顺序是.java文件---->.class文件---->.jar文件。
DVM执行顺序是.java文件---->.class文件---->.dex文件。
③.DVM允许在有限的内存中同时运行多个进程。
④.DVM由Zygote创建和初始化
⑤.DVM有共享机制。
2.DVM架构
将java编译器编译的.class文件经过DX工具转成.dex文件,.dex文件交由类加载器处理,接着解释器根据指令集对Dalvik字节码进行解释、执行,最后交由Linux处理。
3.DVM的运行时堆
DVM运行时堆使用标记-清除算法进行GC的。
4.DVM的GC日志:DVM每次垃圾收集都会将GC日志打印到logcat上。如下:
D/dalvikvm:<GC_Reason><Amount_freed>,<Heap_stats>,<External_memory_stats>,<Pause_time>
分别对应是引起GC的原因,本地释放GC的内存大小,堆的空闲内存百分比,API小于10的内存分配,暂停时间。
二.ART虚拟机
简介:ART虚拟机是android 4.4发布的,用来替换Dalvik虚拟机,Android 4.4默认采用Dalvik虚拟机,系统提供了一个选项来开启ART虚拟机(在用户的设置界面中可以开启)。在android 5.0中默认采用ART虚拟机。
1.ART与Dalvik区别:
①.DVM在每次程序运行时,字节码都需要通过JIT编译器编译成机器码,这样应用程序的运行效率很低。而在ART中,系统在安装应用时会进行一次预编译(AOT),将字节码转成机器码并存储在本地。但是采用AOT也有两个缺点:1.第一次安装时间较长;2.需要存储空间较多。为了解决这两个问题,android 7.0版本中的ART加入了即时编译器JIT,在应用程序安装时并不会将字节码全部编译成机器码,而是在运行中将热点代码编译成机器码。
②.DVM是为了32位CPU设计的,而ART支持64位并兼容32位cpu。
③.ART对垃圾回收机制进行了改进。比如更频繁的执行垃圾收集,将GC暂停由2次减少到1次。
④.ART运行时堆空间划分和DVM不同。
三.Dalvik与ART的诞生
是在Zygote进程中诞生的,这样Zygote进程中持有DVM或者ART实例,此后Zygote进程fork自身创建应用进程时,应用程序进程也得到DVM或者ART实例,这样不需要每次启动应用程序进程都要创建DVM或者ART,从而加快应用程序进程的启动。