java的jvm与android中的虚拟机的区别

今天给大家整理了一下jvm和android 使用的Dalvik(dvm)的区别
首先看一下android的结构层图java的jvm与android中的虚拟机的区别_第1张图片
从应用层相应调用Application framework层,这俩层都是由java程序编写的,然后通过JNI接口调用c层,最后执行在dvm虚拟机上,所有的核心全部依赖于linux核心层

然后我们聊一下java在jvm上是怎么编译运行,实现跨平台的呢?

我们会编写一个简单的java类,然后jre通过javac编译成class文件,jvm.cfg会去寻找jvm.dll,jvm.dll是jvm的主要实现,jvm.dll会通过JNI接口去jvm虚拟机里执行main方法,
字节码文件全部编译成机器指令,最后机器上执行指令

在android中,有一点不同,他也会先从java类,通过javac编译成class,它会通过dex工具把class编译成dex文件,如果有分包就会有多个dex,最后吧dex打包成apk,安装在了安卓机上,相当于dvm执行的是dex

简单来说 ,jvm执行的是class字节码,dvm执行的是dex
下面贴张图

区别一:
dvm执行的是.dex格式文件 jvm执行的是.class文件 android程序编译完之后生产.class文件,然后,dex工具会把 .class文件处理成 .dex文件,然后把资源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm执行的是.class文件。
区别二:
dvm是基于寄存器的虚拟机 而jvm执行是基于虚拟栈的虚拟机。寄存器存取速度比栈快的多,dvm可以根据硬件实现最大的优化,比较适合移动设备
区别三:
.class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中。减少了I/O操作,提高了类的查找速度

总结: JVM以Class为执行单元,Android虚拟机以Dex执行单元,编译流程JVM直接通过Javac即可加载。Android虚拟机需要先编译成dex,然后编译成apk。最后执行 Android Art虚拟机在安装的时候讲dex缓存本地机器码,安装比较慢,耗存储空间
Android Dalvik虚拟机在程序运行过程中进行翻译。节省空间,耗cpu时间。以空间换时间的典型

dex和class到底在结构上有什么区别呢

dex 将文件划分为了 三个区域,这三个区域存储了整个工程中所有的java 文件的信息,所以 dex 在类越来越多的时候优势就提现出来了。他只要一个dex文件,很多区域都是可以进行复用的,减少了dex 文件的大小。

本质上他们是一样的,dex 是从 class 文件演变而来的,但是 class 中存在了许多沉余信息,dex 去掉了沉余信息,并进行了整合

下面这段转载于作者@王海萧
原文地址:https://blog.csdn.net/qq_35298279/article/details/113564603

以上是我整理的,希望能帮助到你们

你可能感兴趣的:(android,java,jvm,android)