什么是虚拟机
虚拟机就是一个虚构出来的计算机, 是通过在实际的计算机上仿真模拟各种 计算机功能来实现的。它有自己完善的硬件架构,如处理器、堆栈、寄存器等。
Dalvik虚拟机执行应用流程
Dalvik虚拟机的功能
- 进程管理
进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,所有的Android应用的线程都对应一个Linux线程,进程管理依赖于Zygote机制实现 类加载
解析Dex文件并加载Dalvik字节码:加载应用时从APK文件找到classes.dex文件并从该Dex文件中加载Dalvik字节码供虚拟机执行模块调用当虚拟机在运行时需要调用的一个成员方法或者一个成员变量所属的类没有被解析的时候,虚拟机会调用类加载模块,对这个类、超类以及这些类的相关接口进行加载和连接。
内存管理
负责分配apk运行时需要的内存资源以及垃圾回收- 本地接口(JNI)
上层应用调用本地代码(Java语言与Native语言相互调用) 反射机制
动态查看、调用、更改任意类中的方法和属性,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。反射机制在实现其功能时首先通过上层应用API运用JNI本地调用机制调用本地方法集中的函数,再向下层调用Dalvik虚拟机中的内部函数,最后将结果逐层返回到最上层的应用。
解析器
解析Dex字节码,转换成成本地代码并执行,解析器即使Dalvik的执行引擎- 即时编译(JIT)
将反复执行的字节码编译成本地代码,降低解析器的压力。即使当某一个方法第一次执行时,JIT将对该方法指向的字节码编译成本地代码,然后该方法的指针指向该本地代码,第二次执行时讲直接执行其本地代码,提高运行效率
Dalvik虚拟机与Java虚拟机的区别
- 架构上差异
Dalvik的设计是基于寄存器的,Java虚拟机的设计是基于栈的 - 运行文件格式的差异
Dalvik运行的文件格式是dex,Java虚拟机运行的文件格式是字节码文件
参考资料
- 《Android Dalvik虚拟机结构及机制剖析——第1卷 Dalvik虚拟机结构剖析》
- 《Android Dalvik虚拟机结构及机制剖析——第2卷 Dalvik虚拟机各模块机制分析》