一,DVM和JVM的区别
1,基于的架构不同,
JVM是基于栈的
DVM是基于寄存器的,它没有基于栈的虚拟机复制数据时使用大量的出栈和入栈指令,同时指令更紧凑,更简洁。由于是显示的指定了操作数,所以基于寄存器的指令会比基于栈的指令要大,但是由于指令数量的减少总的代码量不会增加多少
2,执行的字节码不同
Java类被编译成一个或者多个.class文件,并且打包成jar包,而后Jvm通过相应的.class文件和jar文件获取相应的字节码
执行顺序是Java文件-.class文件-.jar文件
而DVM的执行顺序是Java文件-.class文件-.dex文件
DVM早期没有JIT编译器,Android 2.2之后才有的
DVM有共享机制-不同应用之间可以共享相同的类,JVM没有
DVM允许在有限的内存中运行多个进程-好处就是防止在虚拟机奔溃的时候,所有应用被关闭
DVM有Zygote创建和初始化-对于只读的系统库都会共享Zygote的一块内存区域,节省内存开销
二,ART和DVM的区别
1,DVM每次运行应用程序的时候,都需要通过JIT编译器编译机器码,会降低应用程序的打开时间
2,ART是在安装的时候会进行一次AOT(预编译),将字节码编译成机器码并存储在本地
这样的好处显而易见,就是应用的打开速度是提升了,但是应用安装占用的存储空间是增加的
为了解决上面的缺点,Android 7.0加入了JIT编译器,只会在安装的时候编译热点代码保存在本地
3,DVM是为32位CPU设计的,而ART是为64位CPU设计,并且兼容32位应用,这是DVM被淘汰的主要原因
4,ART对垃圾回收机制进行的改进,比如更频繁的进行垃圾收集,将GC暂停由俩次减少为一次
5,ART的运行时堆空间划分和DVM不同
和DVM不同的是ART采用了多种垃圾收集方案