`

Android Dalvik虚拟机初识

阅读更多
转自http://iaiai.iteye.com/blog/1397738

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

什么是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共 享一块内存区域,大大节省了内存开销。



分享到:
评论

相关推荐

    Android Dalvik虚拟机结构及机制剖析 第2卷.pdf

    但我可以根据标题所揭示的主题,即“Android Dalvik虚拟机结构及机制剖析”,来生成相关的知识点。 Dalvik是Android操作系统中用于执行应用程序的虚拟机。它专为移动设备优化,使得Android应用能够高效运行。Dalvik...

    Android Dalvik虚拟机结构及机制剖析第2卷

    Android Dalvik虚拟机是Android操作系统的核心组件之一,它为Android应用程序提供了一个运行环境。本卷主要探讨了Dalvik虚拟机的结构与工作机制,旨在深入理解Android应用的执行流程和优化策略。 首先,我们要理解...

    《Android Dalvik虚拟机结构及机制剖析》PDF

    《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android ...

    Android Dalvik虚拟机结构及机制剖析 第1卷.pdf

    根据提供的文件信息,我们可以了解到文件内容是关于Android Dalvik虚拟机的结构及机制的深入剖析。虽然文件本身并没有提供实际的内容,但我们可以从标题和描述中提取出相关知识点。 首先,标题“Android Dalvik...

    进入 Android Dalvik 虚拟机

    进入 Android Dalvik 虚拟机,android dalvik介绍 Dalvik 虚拟机的特点——掌握 Android 程序的运行原理 Android 系统的架构采用分层思想,这样的好处是拥有减少各层之间的依赖性、便于独 立分发、容易收敛问题和...

    Android虚拟机Dalvik(略谈Android Dalvik虚拟机)

    ### Android虚拟机Dalvik概述 #### 一、Dalvik虚拟机简介 Dalvik虚拟机是Android操作系统的核心组件之一,由Google公司开发并用于其移动操作系统Android中。它是一种专为移动设备设计的轻量级虚拟机,旨在提高性能...

    Dalvik虚拟机简要介绍

    Dalvik虚拟机是Android操作系统中用于执行应用程序的虚拟机。它的作用主要是解释执行Android应用程序中的Dalvik可执行文件(DEX格式),使得Java程序能够在Android设备上运行。Dalvik虚拟机与Java虚拟机(JVM)有很...

    Android Dalvik虚拟机讲义

    **Android Dalvik虚拟机讲义** Android Dalvik虚拟机是Android操作系统的核心组成部分,它是Google为移动设备特别设计的一种高效、轻量级的虚拟机。在Android系统中,应用程序以Dalvik可执行文件(.dex)的形式运行...

    Dalvik虚拟机 PPT版

    Android应用程序是运行在Dalvik虚拟机里面的,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Android应用程序中的Dalvik虚拟机实例实际上是从Zygote进程的地址空间拷贝而来的,这样就可以加快Android应用...

    《Android Dalvik虚拟机结构及机制剖析 Dalvik虚拟机各模块机制分析 第2卷》PDF

    《Android Dalvik虚拟机结构及机制剖析 Dalvik虚拟机各模块机制分析 第2卷》是一部深入探讨Android系统核心组件——Dalvik虚拟机的专业书籍。它详细解析了Dalvik虚拟机的内部构造和运行机制,是Android开发者和系统...

    Android Dalvik虚拟机操作码

    Android系统的核心之一是Dalvik虚拟机,它是Google专门为Android平台设计的一种基于寄存器的Java虚拟机。在Android应用开发中,所有应用都是用Java或Kotlin等编程语言编写,然后通过编译器转换成Dalvik字节码,也...

    Android Dalvik虚拟机结构及机制剖析第1卷

    《Android Dalvik虚拟机结构及机制剖析第1卷》是一本深入探讨Android系统核心组件——Dalvik虚拟机的专业书籍。本书旨在为读者揭示Android应用程序运行的底层机制,帮助开发者理解和优化应用性能。作为Android开发的...

    Android Dalvik虚拟机之Dalvik指令集

    Android系统的核心之一是其独特的Dalvik虚拟机,它是专门为移动设备设计的,旨在高效地运行Android应用程序。在Android操作系统中,应用代码以.dex(Dalvik Executable)格式存储,这种格式是为Dalvik虚拟机优化的。...

    android dalvik虚拟机结构及机制剖析 第二卷

    android dalvik虚拟机结构及机制剖析 第二版,详细介绍Android虚拟机值得阅览

    dalvik虚拟机运行过程分析

    Dalvik虚拟机是Android操作系统早期版本中使用的虚拟机,它的运行过程涉及多个步骤和组件。以下是对Dalvik虚拟机启动及运行过程的详细解析: 1. **JNIEnv.CallStaticVoidMethod**:在C++层,JNIEnv是一个结构体,它...

    AndroidDalvik虚拟机结构及机制剖析

    资源名称:Android Dalvik虚拟机结构及机制剖析资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Android Dalvik虚拟机JNI方法的注册过程分析

    在Android应用中,当Dalvik虚拟机执行到一个标记为`@Native`的方法时,即JNI方法时,不会像普通Java方法那样由Dalvik虚拟机解释执行,而是直接跳转到预先注册好的本地代码地址执行。这种方法的执行效率更高,且可以...

    Android Dalvik虚拟机的启动过程源码分析

    ### Android Dalvik虚拟机的启动过程源码分析 #### 一、概述 在深入探讨Dalvik虚拟机(Dalvik Virtual Machine, DVM)的启动过程之前,我们需要了解DVM的基本概念及其在Android系统中的作用。DVM是Android操作系统...

    浅析dalvik虚拟机JIT技术的实现.doc

    Dalvik虚拟机是专为Android设计的虚拟机,不同于传统的Java虚拟机(JVM),它采用寄存器架构而非栈架构,旨在减少内存占用,适应移动设备的硬件限制。在Android 2.2版本中,Dalvik虚拟机引入了JIT技术,这一技术通过...

Global site tag (gtag.js) - Google Analytics