虚拟机之DVM

本文介绍了Android的Dalvik虚拟机(DVM),它与Java虚拟机(JVM)的区别在于基于寄存器而非栈。DVM的执行文件为dex,每个dex包含多个类,而JVM使用class文件。DVM根据硬件架构设计多种运行模式以实现跨平台。每个DVM实例仅运行一个Java程序。Android应用进程由Zygote进程孵化,Zygote预先加载核心库并创建DVM实例。当创建新应用进程时,通过fork复制Zygote,共享Zygote堆以节省内存并加速启动。
摘要由CSDN通过智能技术生成

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方法

====================================================================================================================================

DVM的运行过程
解释执行与编译执行,编译执行又分为AOT和JIT,及提前编译和运行时编译。
DVM有三种执行模式
1. portable,可移植模式,这种模式下可以在任何平台上运行,如ARM,X86。
2. fast, 快速模式,这种模式是针对特定平台进行了优化,执行更快。
3. jit,动态编译执行,这种模式在运行过程中动态将java字节码编译成本地机器码直接执行。


DVM的解释器是以模块化方法自动生成,并能够根据一个特定平台进行优化。
模块化方法是指将解释器的实现分为多个模块,每个模块对应多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值