虚拟机
JVM:JVM全称Java Virtual Machine(Java虚拟机),是一个虚构出来的计算机,作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,Dalvik、Art就是安卓中使用的虚拟机
一. 简述虚拟机区别
1.1 JVM虚拟机和Android虚拟机的区别
1.2 Dalvik虚拟机和Art虚拟机的区别
Art:典型的空间换时间,应用安装时翻译为字节码占用大量空间,cpu使用减少,耗电减少
总结
JVM执行的是.class文件。一个class文件代表一个类,多次加载,多次IO(class文件包含很多冗余信息)。jvm执行是基于虚拟栈的虚拟机
Android虚拟机执行的是.dex文件。一个dex包含所有系统类,一次加载,一次IO(dex工具去除冗余信息)。Android虚拟机是基于寄存器的虚拟机
(详见:三. 寄存器和栈的区别)
二. class及dex区别
2.1 文件结构
总结
1. dex文件减少整体的文件大小,dex更像是一种压缩文件,一个dex可以表示更多的class;
class像是一种单个文件。
2. Android虚拟机加载类时,只对dex进行一次IO就可以加载很多类,而class需要被加载多次,进行多次IO,因此Android虚拟机的查找速度快
3. dex指令更加密集,class指令比较多(待理解)
4. dex寄存器设计方便寻址,class java栈需要多次load和store指令(待理解)
5. dex适合于移动设备,性能不太高的。class适合PC大内存,单指令小的可以快速执行
三. 寄存器和栈的区别
总结:
java虚拟机是基于栈的结构。基于栈的指令紧凑,指令仅占一个字节,称为字节码
Android虚拟机是基于寄存器的结构。基于寄存器的指令由于需要制定源地址和目标地址,因此需要占用更多的指令空间,Dalvik虚拟机的某些指令需要占用两个字节
基于栈和基于寄存器各有优劣,一般而言,执行同样的功能:
基于栈需要更多的指令(主要是load和store指令,意味着更多的指令分配次数和内存访问次数,访问内存是执行速度的一个重要瓶颈),意味着要多占用CPU时间
而基于寄存器需要更多的指令空间,意味着有数据缓冲,更容易失效
暂存于此,后续补充。。。