转 Android Dalvik虚拟机初识

首先,让我们来思考下面几个问题:

什么是Dalvik虚拟机?

Dalvik VM与JVM有什么区别?

Dalvik VM有什么新的特点?

Dalvik VM的架构是怎么样的?

首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息。

Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它有自己完善的硬件架构(如处理器、堆 栈、寄存器等),还具有相应的指令系统。使用“Java虚拟机”程序就是为了支持与操作系统无关、在任何系统中都可以运行的程序。

因此,我们不妨对Dalvik虚拟机作出这样的描述:

Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器 架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库 (libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高 性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

与Dalvik虚拟机关系最密切的非JVM莫属,在Android源码readme文档中有这样一段话:Much of the code under this directory originally came from the Apache Harmony project, and as such contains the standard Apache header comment. Some of the code was written originally for the Android project…

Dalvik VM与Apache Harmony 项目关系源远流长,因此,与JVM关系自然就密切了。

然而:Dalvik VM ≠Java VM

dalvik基于寄存器,而JVM基于stack

Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。

优势:1、在编译时提前优化代码而不是等到运行时

2、 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例。

3、常量池已被修改为只使用32位的索引,以 简化解释器

JVM的字节码主要是零地址形式的,概念上说JVM是基于栈的架构。Google Android平台上的应用程序的主要开发语言是Java,通过其中的Dalvik VM来运行Java程序。为了能正确实现语义,Dalvik VM的许多设计都考虑到与JVM的兼容性;但它却采用了基于寄存器的架构,其字节码主要是二地址/三地址的混合形式。

基于栈与基于寄存器的架构,谁更快?现在实际的处理器,大多都是基于寄存器的架构,从侧面反映出基于寄存器比基于栈的架构更与实际的处理器接近。但 对于VM来说,源架构的求值栈或者寄存器都可能是用实际机器的内存来模拟的,所以性能特性与实际硬件又有不同。一般认为基于寄存器架构的Dalvik VM比基于栈架构JVM执行效率更高,原因是:虽然零地址指令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派 (instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完 成操作,指令分派与内存访问次数都较少。

我们从下面的截图可以明了的看到与同一段Java代码对应的Java bytecode 与Dalvid bytecode的比较。

专有的DEX文件格式

一个应用中会定义很多类,

编译完成后即会有很多相应

的CLASS文件,CLASS文件

间会有不少冗余的信息。

dex字节码和标准Java的字节码(Class)在结构上的一个区别是dex字节码将多个文件整合成一个,这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。

原来每个类文件中的常量池现在由DEX文件中一个常量池来管理。

DEX文件可以进行进一步优化。优化主要是针对以下几个方面:

1、调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的没一个域

2、验证DEX文件中的所有类

3、对一些特定的类进行优化,对方法里的操作码进行优化

优化 优化后的文件大小会有所增加,应该是原DEX文件的1-4倍。

odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化

一个应用,一个虚拟机实例,一个进程!!!

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。每个进程之间可以通信(IPC,Binder机制实现)。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。

不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它 虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。

Zygote是虚拟机实例的孵化器。AndroidRuntime.cpp中ZygoteInit.main()的执行会完成一个分裂,分裂出来 的子进程继续初始化Java层的架构,这个分裂出来的进程就是system_server。每当系统要求执行一个Android应用程序,Zygote就 会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的 加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例 都和Zygote共享一块内存区域,大大节省了内存开销。

时间: 2024-11-06 22:28:12

转 Android Dalvik虚拟机初识的相关文章

Android Dalvik虚拟机初识

摘自:http://blog.csdn.net/andyxm/article/details/6126907 首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息. Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计

Chapter3——进入Android Dalvik虚拟机

虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的. 可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik Virtual Machine. 上面是第三章的前言,一年多以前,作者写这本书的时候,Kitkat(Android 4.4)还没有出来,作者也声明这本书默认使用的是Android4.1和Linux3.4的环境. 而4.4版本的Android的「开发者选项」中已经添加了Art模式和Dalvik模式切换的

Chapter3——进入Android Dalvik虚拟机(二)

Dalvik汇编语言基础 Dalvik虚拟机为自己设计了一套指令集,并制定了自己的指令格式和调用规范. 位描述约定如下: 每16位的字采用空格分隔开来 每个字母表示4位,每个字母按顺序从高字节开始,排列到低字节.每4位之间可能使用竖线「|」表示不同的内容. 顺序采用A~Z的单个大写字母作为一个4位操作码,op表示一个8位的操作码. 「∅」来表示这字段所有位为0值. 以「A|G|op BBBB F|E|D|C」为例, 指令中间两个空格每个分开的部分大小为16位: 第一个16位A|G|op,高8位由

安卓移动逆向(三)-Android Dalvik虚拟机

大家都知道Java程序是运行在Java虚拟机上,Android程序呢? 虽然Android平台使用Java语言来开发应用程序,但是Android程序却不是运行在标准的Java虚拟机上的. Google为Android平台专门设计了一套虚拟机来运行Android程序–Dalvik Virtual Machine,也就是Dalvik虚拟机了 本篇作用: 扫盲Dalvik虚拟机 了解Smail的语法,能读懂Smail文件 Dalvik概述 Dalvik的特点(相对于JVM) 体积小,占用内存小; 专有

Android Dalvik虚拟机简述(与Java虚拟机的区别和简要的执行原理)

先一睹Dalvik虚拟机在Android系统框架图中位置: 文章目录: 一.虚拟机简述二.Java虚拟机简述三.Dalvik虚拟机简述四.Dalvik虚拟机与Java虚拟机的区别五.Dalvik虚拟机执行原理简述 此文章原始是PPT格式已转换为PDF,请直接下载文档阅读: AndroidDalvikVMOverview

进入Android Dalvik虚拟机之Dalvik虚拟机的特点

Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野.它的作者是丹.伯恩斯坦(Dan Bornstein).Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点: 体积小,占用内存空间小: 专有的DEX可执行文件格式,体积更小,执行速度更快: 常量池采用32位索引值,寻址类方法名,字段名,常量更快: 基于寄存器架构,并拥有一套完整的指令系统: 提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能: 所有

Android Dalvik虚拟机概述

Dalvik虚拟机概述 Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一.它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进

Android Dalvik虚拟机和ART虚拟机对比

1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.Dalvik vs ARTDalvik Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件,但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex

【Android Dalvik虚拟机好学易用系列】之二:Dalvik汇编语言

一 Dalvik指令格式 1.1 位描述 Dalvik汇编代码由Dalvik指令组成,指令语法由指令的位描述与指令格式辨识来决定.位描述的约定如下所示: 每16位的字采用空格分隔开来: 每个字母表示四位,每个字符顺序从高字节开始,排列到低字节,每四位之间可能使用"|"来表示不同的内容. 顺序采用A~Z的单个大写字母作为一个4位操作码,op表示一个8位的操作码: "?"表示这字段所有位为0值. 举例,如以下指令: A|G|op BBBB F|E|D|C 两个空格:每个