Dalvik VM与JVM的区别

本文对比介绍了Java虚拟机(JVM)与Android系统的Dalvik虚拟机(DalvikVM)的特点与工作原理。JVM实现了Java程序的跨平台性,而DalvikVM则针对Android系统进行了优化,提高了代码执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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是虚拟机实例的孵化器,它在系统启动的时候就会产生,它会完成虚拟机的初始化、库的加载、预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的速度提供给系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值