JVM(Java Virtual Machine):
jvm是虚构出来的运行java程序的运行时,jvm实现了java程序的跨平台性。jvm是基于栈的。
.java --javac--> .class --jar--> .jar
jvm运行的是.class文件
Dalvik VM
.java --javac--> .class --dx.bat--> .dex --进一步优化--> .odex
DalvikVM是在Android系统上运行Android程序的虚拟机,其指令集是基于寄存器架构的,执行特有的文件格式-dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。
相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些硬件上的通用性,但是它在代码的执行效率上要更胜一筹。另外虽然牺牲了jvm的跨平台特性,但是因为Dalvik vm本来就是就是为Android系统设计的,因此无需考虑跨平台性。
Dalvik vm不能运行.class,运行的是通过DX工具将.class转化成的.dex文件。
每个.java文件生成一个.class文件,因此.jar文件中包含很多.class文件,
Dalvik vm会通过DX工具对所有的.class进行重构整合成一个.dex文件,.dex文件包括头域(header)、常量池(Constant Pool)、类定义(ClassN definition)可以有多个、数据段(Data)。具体做法是将所有.class文
件中的常量,包括引用、方法名、数值常量等整合到.dex中的常量池中;访问标识、类名等基本信息整合到.dex的类定义中;各种被VM指定的方法代码以及类和方法的相关信息和实例变量等整合到.dex的数据段中,通过整合.dex文件格式可以减少整体文件尺寸,提高I/O操作的类查找速度,大大提高了Android程序的运行速度。
另外,Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,即每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭,Dalvik vm的实例化是由Zygote来实现的,Zygote是虚拟机实例的孵化器,它在系统启动的时候就会产生,它会完成虚拟机的初始化、库的加载、预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的速度提供给系统。
jvm是虚构出来的运行java程序的运行时,jvm实现了java程序的跨平台性。jvm是基于栈的。
.java --javac--> .class --jar--> .jar
jvm运行的是.class文件
Dalvik VM
.java --javac--> .class --dx.bat--> .dex --进一步优化--> .odex
DalvikVM是在Android系统上运行Android程序的虚拟机,其指令集是基于寄存器架构的,执行特有的文件格式-dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。
相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些硬件上的通用性,但是它在代码的执行效率上要更胜一筹。另外虽然牺牲了jvm的跨平台特性,但是因为Dalvik vm本来就是就是为Android系统设计的,因此无需考虑跨平台性。
Dalvik vm不能运行.class,运行的是通过DX工具将.class转化成的.dex文件。
每个.java文件生成一个.class文件,因此.jar文件中包含很多.class文件,
Dalvik vm会通过DX工具对所有的.class进行重构整合成一个.dex文件,.dex文件包括头域(header)、常量池(Constant Pool)、类定义(ClassN definition)可以有多个、数据段(Data)。具体做法是将所有.class文
件中的常量,包括引用、方法名、数值常量等整合到.dex中的常量池中;访问标识、类名等基本信息整合到.dex的类定义中;各种被VM指定的方法代码以及类和方法的相关信息和实例变量等整合到.dex的数据段中,通过整合.dex文件格式可以减少整体文件尺寸,提高I/O操作的类查找速度,大大提高了Android程序的运行速度。
另外,Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,即每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭,Dalvik vm的实例化是由Zygote来实现的,Zygote是虚拟机实例的孵化器,它在系统启动的时候就会产生,它会完成虚拟机的初始化、库的加载、预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的速度提供给系统。