`
寻梦者
  • 浏览: 638188 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android中的dalvik虚拟机浅析

阅读更多

这篇文章内容大部分来自一年前的一篇调研报告,加上对dalvik虚拟机的一些认识,匆忙整理出来供大家参考。如有不对的地方请不吝指出。


I.什么是Dalvik虚拟机?

II.DalvikVMJVM有什么区别?

III.DalvikVM有什么新的特点?

IV.DalvikVM的架构是怎么样的?


n‍111111111111111111

 

 

 

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

 

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

 

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

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

n‍2222222222222222222222222222222222

 

然而:DalvikVM ≠Java VMI.dalvik基于寄存器,而JVM基于stack II.Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。

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

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

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


 

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

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

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

‍‍

n33333333333333333333333333333333333

专有的DEX文件格式

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

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

CLASS文件,CLASS文件

间会有不少冗余的信息

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

u原来每个类文件中的常量池DEX文件中一个常量池来管理

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

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

  2验证DEX文件中的所有类 

  3对一些特定的类进行优化,对方法里的操作码进行优化优化优化后的文件大小会有所增加,应该是原DEX文件的1-4倍。odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化, 这个步骤在安装程序的时候可以看到。

 

DEX文件的生成:

Android系统和Dalvik虚拟机提供了工具(DX) 在把Java源代码编译成CLASS文件后 使用DX工具(见补充2) DEX文件的结构相对于.jar更加紧凑 但是为了获得高效率我们还得进一步对.dex进行优化。

 

n444444444444444444444444444

 

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

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

 

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

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





分享到:
评论

相关推荐

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

    ### 浅析Dalvik虚拟机JIT技术的实现 #### 引言 随着移动设备的普及,Android系统作为全球最大的移动操作系统之一,其性能优化一直是开发者关注的重点。Dalvik虚拟机,作为Android早期的核心组件,引入了即时编译...

    基于Linux的Android OS平台应用浅析.pdf

    - **Dalvik虚拟机**:每个Dalvik虚拟机实例运行一个Android应用,线程管理和内存分配由Linux内核负责。Zygote进程是虚拟机的起点,它预先加载和初始化虚拟机实例,当需要新实例时,通过复制自身快速生成。 - **...

    Android防止内存溢出浅析

    在Android开发中,防止内存溢出是一个至关重要的任务,因为Android设备的内存资源相对有限,尤其是在Dalvik虚拟机中,其最大堆大小通常只有16MB。本文将深入探讨Android平台上的内存管理机制,以及如何避免内存泄露...

    Android防止内存溢出浅析.zip

    - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,它们都有自己的内存管理策略。 - **堆内存**:Java对象主要存储在堆中,Android为每个应用分配了一定量的堆内存。 - **垃圾回收(GC)**...

    Android平台安全机制浅析.pdf

    Dalvik虚拟机的隔离机制可以防止应用程序之间的相互干扰,提供了更加安全的应用环境。但是,随着技术的发展,Android系统所面临的威胁也在不断增加,比如恶意软件和病毒的攻击。因此,需要不断地对运行环境的安全性...

    基于Android防止内存溢出浅析

    Android系统采用Dalvik或ART虚拟机来运行应用程序,每个应用都有自己的内存空间,当这个空间被耗尽时,就会触发内存溢出。Android设备的内存资源相对有限,因此优化内存使用对于提升用户体验至关重要。 **内存泄漏*...

    浅析Android智能手机平台

    ### 浅析Android智能手机平台 #### 一、引言 随着移动互联网技术的快速发展,智能手机逐渐成为人们生活中不可或缺的一部分。Android作为一款广受欢迎的操作系统,不仅因其强大的功能和灵活性受到消费者的喜爱,也...

    Android嵌入式系统架构及内核浅析_王茜

    6. 运行框架:包括应用程序框架和Dalvik虚拟机等,为应用程序提供接口和服务。 7. 应用程序:直接与用户交互的软件程序。 Android系统架构的具体组成可以参考图1,分为Linux内核、程序库、Android运行时、应用程序...

    基于OpenMax的Android多媒体架构浅析.pptx

    Dalvik虚拟机的dex文件在首次启动时转化为odex文件,加快后续启动速度;数据库预处理减少了启动时的扫描时间;Linux系统的Copy-On-Write(COW)机制使得进程创建更为高效;此外,针对特定CPU架构(如armv5te)的优化...

    Android应用源码之防止内存溢出浅析.zip

    Android系统采用Dalvik虚拟机(在Android 5.0之后改为ART)执行应用代码,其内存管理基于垃圾回收(Garbage Collection, GC)。GC会自动回收不再使用的对象,但开发者仍需关注内存占用,避免过度分配导致的内存溢出...

    Android应用源码之防止内存溢出浅析-IT计算机-毕业设计.zip

    Android系统采用Dalvik虚拟机(Dalvik Virtual Machine,DVM)进行应用执行,每个应用都有自己的虚拟机实例,内存空间独立。DVM使用垃圾回收机制(Garbage Collection,GC)自动回收不再使用的对象,但开发者仍需...

    Android系统智能手机安全威胁及保护机制浅析.pdf

    其中,程序沙盒机制确保了每个应用程序在独立的Dalvik虚拟机中运行,拥有独立的UID,这样即使某个应用出现问题,也不会影响到整个系统的稳定。文件访问控制是通过用户ID和权限组合来限制文件的读、写、执行权限,...

    Android嵌入式系统架构及内核浅析

    - **Dalvik Virtual Machine (DVM)**:这是一个专门为Android设计的虚拟机,用于执行应用程序中的.dex格式的字节码文件。 - **Core Libraries**:这些核心库包含了一系列的标准Java库,以及一些专为Android设计的...

    Android 淺探(二):系統架構

    Android的关键组成部分是Dalvik虚拟机(在现代版本中已被ART替代),它负责执行Java字节码。Dalvik虚拟机优化了资源的使用,以适应移动设备有限的内存和处理器能力。Java应用程序在此层面上运行,利用系统库提供的...

    安卓Android源码——防止内存溢出浅析.zip

    本篇文章将深入浅析Android源码中的内存管理机制,以及如何预防和处理内存溢出问题。 首先,我们需要理解Android应用的内存结构。Android系统的内存分为堆(Heap)和栈(Stack)。栈主要存放方法的局部变量,而堆则...

    浅析Android系统的四大基本组件.pdf

    中间层包括C++编写的库和Dalvik虚拟机;上层则是各种应用软件,如电话、短信应用等,由第三方开发者编写。Android应用的核心组件包括Activity、Service、Content Provider和Broadcast Receiver。 1. **Activity**:...

    ADB通讯协议浅析

    在设备端,adbd会创建localsocket和remotesocket,分别用于与Dalvik虚拟机进行通信,以及与adbserver进行数据传输。 adbserver是运行在电脑上的后台进程,用于管理客户端与设备上守护进程的通信。其主要工作包括...

Global site tag (gtag.js) - Google Analytics