JAVA虚拟机与Android虚拟机的区别

1.JAVA虚拟机运行的是JAVA字节码,Dalvik虚拟机运行的是Dalvik字节码
java虚拟机:JAVA->class文件
dalvik虚拟机:JAVA->class文件->Dalvik字节码->打包到dex中->DVM通过解释DEX文件来执行这些字节码。

class文件的缺点
如果A类文件引用B类文件中的方法,方法签名也会被复制到A类文件中,
多个不同的类会同时包含相同的方法签名
大量的字符串常量在多个类文件中也被重复使用
因为大量的冗余信息,会严重影响jvm虚拟机解析文件的效率。

Dalvik虚拟机
SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,**对JAVA类文件重新排列,**将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享同一个常量池,使得相同的字符串、常量在DEX文件中只出现一次,从而减小了文件的体积。
在这里插入图片描述
2.JVM基于栈,DVM基于寄存器
关于栈式虚拟机:
1.代码必须使用这些指令来移动变量(即push和pop)
2.代码尺寸小和解码效率会更高些

关于寄存器式虚拟机:
1.基于寄存器代码免去了使用push和pop命令的麻烦,减少了每个函数的指令总数。
2.代码尺寸和解码效率不如基于栈虚拟机,因为它包含操作数,所以指令大于基于堆栈的指令。但是基于寄存器产生更少的代码,所以总的代码数不会增加。
3.寄存器虚拟机必须从操作指令中解码操作数,需要额外的解码操作。

与JVM相似,在Dalvik VM中每个线程都有自己的PC和调用栈

与JVM不同的是,Dalvik VM的栈帧中没有局部变量区与求值栈,取而代之的是一组虚拟寄存器

3.ART虚拟机,和JVM/DVM有什么不同?
JIT(Just In Time,即时编译技术)和AOT(Ahead Of Time,预编译技术)

JIT:javac将java源码变为class字节码,逐条解释class,翻译成对应的机器指令,逐条解释翻译,必然比C/C++编译后的可执行二进制字节码程序慢,就出现了JIT,**JIT运行时分析应用程序的代码,**识别热方法,热方法会被JIT编译器编译成对应的汇编代码,存储到代码缓存中,以后调用不用解释执行了

AOT:编译器在编译时直接将程序源码编译成目标机器码,运行时直接运行机器码。

Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码

Dalvik执行的是dex字节码,依靠JIT编译器解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,但这个过程发生在应用程序的运行过程中,应用程序每一次重新运行的时候,都要重新做这个翻译工作

ART:安装应用的时候,dex中的字节码将被编译成本地机器码,之后每次打开应用,执行的都是本地机器码。移除了运行时的解释执行,效率更高,启动更快。

ART缺点
①更大的存储空间占用,可能增加10%-20%
②更长的应用安装时间

ART是空间换时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的代码家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值