什么是虚拟机?
虚拟机就是将平台无关的.class文件的字节码翻译成平台相关的机器码,来实现跨平台;
jvm:Java 文件->编译器>class字节码->JVM->机器码
android:Java 文件->编译器>class字节码->dex工具->dex->aapt工具->apk
java的jvm虚拟机与Android的虚拟机有什么区别?
- java执行的是.class文件;Android虚拟机执行的是.dex文件;
- class文件存在的冗余信息;dex工具将多个class编译成dex时会去除这些冗余信息;
- jvm是基于虚拟机栈的虚拟机;Android虚拟机是基于寄存器;
Android的Dalvik虚拟机和Art虚拟机有什么区别?
- Dalvik虚拟机是5.0之前的;Art虚拟机是5.0出来的;
- Dalvik虚拟机,运行时,JIT编译器实时将dex文件中的字节码翻译成机器码;比较耗cpu资源;
- Art虚拟机,是在安装的时候将dex文件中的字节码翻译成机器码,储存起来,运行时执行速度比较快;
- ART虚拟机在7.0之后,是安装时没有翻译,运行时翻译,翻译之后储存起来了,之后再运行就不再需要翻译了;
- ART运行时,减少了实时翻译,减少了cpu使用,用电续航就增加了;
class和dex有什么区别(为什么Android要用Dex文件,而不用class文件)?
- dex文件就像压缩文件,将很多class压缩成了一个文件;
- dex文件将所有的class中的方法、常量、变量等,按照类型,放到了一起;(将class分解、零件分类存放)
- dex一次io可以加载多个类,而class需要多次io;
- class文件存在的冗余信息;dex工具将多个class编译成dex时会去除这些冗余信息;
- dex指令少,而class指令密集且多
- dex寄存器设计方便寻址,而class,java需要多次load和store指令;
- dex适合移动设备,对性能要求不高;class适合pc大内存,单指令小的时候可以快速执行;
虚拟机栈和寄存器有什么区别?
- java虚拟机基于栈结果,指令密集且多,每个指令只占一个字节(因而称为字节码),指令多分发指令也就多,从而影响执行效率;
- Android虚拟机寄存器,需要使用原地址和目标地址,需要更多的指令空间,有的指令需要2-3个字节(用空间换时间);一个指令执行多个操作,指令少,分发指令也就少,执行更高效;但是更多指令空间,容易指令丢失失效;
内存分为:
- 方法区
- 堆
- 虚拟机栈(new一个线程就会创建一个虚拟机栈 )
方法区:
存放类信息、static常量;
堆:
存放new的对象、final修饰的对象;
虚拟机栈:
存放方法的局部变量;