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

2022-06-22 14:36:21 浏览数 (1)

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是空间换时间

0 人点赞