DVM概述:
DVM(Dalvik)也就是Android在5.0之前使用的虚拟机.首先看看他去Java虚拟机JVM之间的关系.
Dalvik(DVM)虚拟机不是Java虚拟机(JVM),他是基于寄存器的,而标准Java虚拟机是基于栈,DVM的执行文件是dex,每个dex文件包含多个类,这样可以节约内存空间。JVM的执行文件是class文件,每一个类编译后都是一个class文件。因为JVM基于栈,他完全屏蔽的底层硬件架构,所以具有很好的可移植性,多个Java应用程序可以运行在同一个JVM实例里面。而DVM基于寄存器,所以需要根据不同的硬件架构做不同的设计,因此DVM设计了不同的运行模式,以达到夸平台运行的目的。DVM主要是针对嵌入式系统设计,每个DVM实例里面只运行一个java程序。DVM和JVM都是解释执行,并支持及时编译JIT。
Android应用程序进程都是由Zygote进程孵化出来的,Zygote进程是在系统启动时启动的,Zygote进程启动时会创建一个DVM实例,并在这个实例里面加载Java核心库。Zygote进程在创建应用进程的时候,通过系统调用fork复制自身。在Zygote进程第一次fork应用进程的时候,会将Java堆分为Zygote堆和Active堆,Zygote堆里面存放的是系统启动时候预加载的系统核心类,而Active堆存放的是后期加载的类和创建的对象。这样新创建的应用进程复制的Zygote进程的DVM,同时与Zygote进程共享Zygote堆,即Java核心类库,android核心类和系统资源。这样既能加快应用进程的创建速度,又能节省内存空间。
====================================================================================================================================
DVM启动过程
1.创建DVM实例
2.加载Java核心类库及其JNI
3.为主线程设置JNI环境
4.注册Android核心类的JNI方法
====================================================================================================================================
解释执行与编译执行,编译执行又分为AOT和JIT,及提前编译和运行时编译。
DVM有三种执行模式
1. portable,可移植模式,这种模式下可以在任何平台上运行,如ARM,X86。
2. fast, 快速模式,这种模式是针对特定平台进行了优化,执行更快。
3. jit,动态编译执行,这种模式在运行过程中动态将java字节码编译成本地机器码直接执行。
DVM的解释器是以模块化方法自动生成,并能够根据一个特定平台进行优化。
模块化方法是指将解释器的实现分为多个模块,每个模块对应多