dalvik
在Android 4.4包括4.4以前都是使用的dalvik虚拟机(4.4的时候放出了art的测试版本,从5.0开始正式使用art虚拟机)
dalvik从android开始使用jit(just-in-time)即时编译,就是什么时候用什么时候编译,也就是说app在运行的过程中,dalvik在不断的进行编译,比如说接下去要打开这个activity,dalvik会把相关的字节码再转换成机器码。
每一个Android应用的底层都运行着一个dalvik虚拟机
dalvik支持的是.dex文件的运行,会将dex文件经过优化生成odex文件然后在虚拟机上进行运行,优化的过程可能发生在安装应用时,也可能发生在应用运行时
一般的编译器都是基于堆栈的,但是dalvik是基于寄存器的。基于堆栈的编译器一般会是用大量指令,而基于寄存器的编译器的指令会比较长
art (Android runtime)
使用的aot(ahead-of-time)预编译技术,在应用安装之前,art就已经把所有的字节码全部编译成了机器码。所以相比较而言,art在安装的过程中会比dalvik花费更多的时间且占用更多的内部存储空间,但是在应用运行的过程中却流畅的多,高效又省电。
art依然支持dex文件,将dex文件编译成ELF文件然后在虚拟机上运行
相比较而言,art在垃圾回收,性能问题上都有显著的提升
回收算法的比较
dalvik
大部分主流的dalvik都是采用的标记回收算法(把没有被直接或者间接引用的对象都标记起来等待回收,但是可能会出现较多的内存碎片,因此会由于内存碎片导致的内存依然吃紧再次触发GC),但是也有采用拷贝算法的(生成两块内存区,每次只在其中一块跑,当需要回收的时候,把一块里面用到的都复制到另外一块中去,然后把这一块完全回收)。
很明显的,dalvik的内存回收算法还是有很大的提高空间的。
art
art中会专门开辟大内存空间,art中会把java堆分成专门存放预加载的空间、跟之前dalvik相同作用的控件和大内存空间。大内存空间我们专门用来存放一些占用内存比较大对象的,比方说bitmap。因为大内存的对象通常会造成比较频繁的GC,那么这么一来就大大提高了回收效率。
并且art还支持并发GC,我们知道GC触发的时候所有都会暂停,那么它的什么时候完成会极大的影响用户的体验,并发GC会将暂停的时间极大缩小,让GC卡顿的可能变得更小。
并且art在后台还会有专门的优化算法,做内存整理,减少内存碎片,以及上面讲到的内存分配的时候的大内存分配,内存分配效率也大大提高了。