什么是Dalvik虚拟机?

Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。 依赖于底层Posix兼容的操作系统,它可以简单的完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例, 其代码在虚拟机的解释下得以执行。

很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还有两个明显的不同:

  • Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。
  • 在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文 件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的 CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

Dalvik和Android系统

Android作为新一代的基于Linux的开源手机操作系统,其系统架构由下而上可以分为以下几部分:

  1. Linux内核
  2. 本地库
  3. Android运行库
  4. 应用框架
  5. 应用

图1

如图所示,Android运行库包括两部分:核心库和Dalvik虚拟机。核心库包括了最基本的类库,如data structure, network, Utilities, File system等的,很多实现代码都是来自Apache Harmony 项 目,主要目的是保证虚拟机的类库能够和Java SE的类库最大可能的兼容,从而降低应用开发者从Java SE阵营转移到Android开发阵营的难度,增加其可用性。Dalvik虚拟机主要是完成对象生命周期的管理,堆栈的管理,线程管理,安全和异常的管 理,以及垃圾回收等等重要功能。

Dalvik 虚拟机的主要特征

Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU速度和大量的内存空间。根据 Google的测算,64M的RAM已经能够令系统正常运转了。其中24M被用于底层系统的初始化和启动,另外20M被用于高层启动高层服务。当然,随着 系统服务的增多和应用功能的扩展,其所消耗的内存也势必越来越大。

归纳起来,Dalvik虚拟机有如下几个主要特征:

  • 专有的DEX文件格式

DEX是Dalvik虚拟机专用的文件格式,而为什么弃用已有的字节码文件(CLASS文件)而采用新的格式呢?

1.一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息;而DEX文件格式会把所有的CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。

原来每个类文件中的常量池,在DEX文件中由一个常量池来管理,具体方式如下图:

图2

图3

2.增加了新的操作码的支持

3.文件结构尽量简洁,使用等长的指令,借以提高解析速度

4. 尽量扩大只读结构的大小,借以提高跨进程的数据共享

如何生成DEX文件呢?Android系统和Dalvik虚拟机提供了工具(DX),在把Java源代码编译成CLASS文件后,使用DX工具。

图4

  • DEX的优化

DEX文件的结构是紧凑的,然而如果我们还想要求运行时的性能有进一步提高,我们就仍然需要对DEX文件进行进一步优化。优化主要是针对以下几个方面:

  1. 调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域
  2. 验证DEX文件中的所有类
  3. 对一些特定的类进行优化,对方法里的操作码进行优化

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

优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的 ODEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。

  • 基于寄存器

相对于基于堆栈的虚拟机实现,基于寄存器的虚拟机实现虽然在硬件通用性上要差一些,但是它在代码的执行效率上却更胜一筹。一般来讲,虚拟机中指令的解释执行时间主要花在以下三个方面:

  1. 分发指令
  2. 访问运算数
  3. 执行运算

其中“分发指令”这个环节对性能的影响最大。在基于寄存器的虚拟机里,可以更为有效的减少冗余指令的分发和减少内存的读写访问,如:

图5

虽然Dalvik虚拟机并没有使用目前流行的虚拟机技术,如JIT,但是根据Google的报告,这个功能的缺失并没有令Dalvik虚拟机在性能上有所损失。我们也同时相信,Dalvik虚拟机的性能还有进一步提高的空间。

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

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管 理,Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度 和管理机制。

不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。

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

图6

应用程序包(APK)被发布到手机上后,运行前会对其中的DEX文件进行优化,优化后的文件被保存到缓存区域(优化后的格式被称为DEY),虚拟机会直接执行该文件。如果应用包文件不发生变化,DEY文件不会被重新生成。

图7

Android 应用开发和 Dalvik 虚拟机

Android应用所使用的编程语言是Java语言,和Java SE一样,编译时使用Sun JDK将Java源程序编程成标准的Java字节码文件(.class文件),而后通过工具软件DX把所有的字节码文件转成DEX文件 (classes.dex)。最后使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件(二进 制格式)组合成一个应用程序包(APK)。应用程序包可以被发布到手机上运行。

图8

Dalvik虚拟机简介相关推荐

  1. 【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )

    文章目录 一.Dalvik 虚拟机简介 二.CPU 指令集 三.Dalvik 虚拟机内存 一.Dalvik 虚拟机简介 Android 5.05.05.0 之前使用的是 Dalvik 虚拟机 , 5. ...

  2. 【JVM】jvm虚拟机都有哪些?常用jvm虚拟机简介

    jvm虚拟机都有哪些?常用jvm虚拟机简介 一.Java虚拟机 二.Oracle的HotSpot虚拟机 三.JRockit虚拟机 四.J9虚拟机 五.Java虚拟机拓展 一.Java虚拟机 以下介绍三 ...

  3. Dalvik虚拟机与java虚拟机的区别

    1.Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable). 2.Java虚拟机将.java文件编译成字节码文件(.class ...

  4. 进入Android Dalvik虚拟机之Dalvik指令集

    为什么80%的码农都做不了架构师?>>>    1. 指令特点 Dalvik指定在调用格式上模仿了C语言的调用约定.Dalvik指令的语法与助词符有如下特点: 参数采用从目标(des ...

  5. 【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )

    文章目录 前言 一.打包 Jar 文件和 Dex 文件 1.示例代码 2.打包 Jar 文件 3.打包 Dex 文件 二.反编译 Dex 文件 三.分析 Dex 文件 1.Student 类相关信息 ...

  6. ibm java_IBM i 上Java 虚拟机简介

    Abstract IBM i 上Java 虚拟机简介 Body Java在IT业界有多流行?google上搜索一下java, 结果一目了然(今天早上我搜索到的记录数是840000000条).Java之 ...

  7. Android逆向基础----Android Dalvik虚拟机

    Android Dalvik虚拟机的特点: l  体积小,占用内存空间小. l  专有DEX可执行文件. l  常量池采用32位索引值,寻址类方法名,字段名,常量更快. l  基于寄存器架构,并拥有一 ...

  8. Dalvik虚拟机相关的可执行程序

    当Java程序运行时,都是一个虚拟机解释java的字节码,将这些字节码翻译成本地CPU的指令吗,然后执行.对Java程序而言,负责解释并执行的就是一个虚拟机. dalvikvm的作用就是创建一个虚拟机 ...

  9. android -------- java虚拟机和Dalvik虚拟机

    2019独角兽企业重金招聘Python工程师标准>>> java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体 ...

最新文章

  1. 普罗米修斯 监控_完美的分布式监控系统——普罗米修斯
  2. 别上当!这些都是5G假项目!
  3. git查看各个branch之间的关系图
  4. c语言不同指令意识,C语言必须理清的概念1
  5. 【深度学习】Ivy 开源框架,深度学习大一统时代到来?
  6. 【牛客 - 289H】约会(思维,数学,奇偶数,水题)
  7. python连接oracle数据库_深入理解Python3.6连接Oracle数据库
  8. python标志变量_Python 中的 global 标识对变量作用域的影响
  9. 基于JAVA+Servlet+JSP+MYSQL的中小型财务管理系统
  10. Selenium中WebDriver的close()和quit()
  11. Entity Framework 6新特性:全局性地自定义Code First约定
  12. 【错误分析】NX error status: 32
  13. spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求
  14. 一系列JavaScript的基础工具
  15. Gallery和BaseAdapter容器
  16. 机器人控制框架行为树py_trees <一、行为树介绍>
  17. 苹果中国官网新增蚂蚁花呗 24 期分期免息服务
  18. android edittext 下划线没了,关于android:如何在EditText中隐藏下划线
  19. [clear] python 种子转磁力链
  20. 苹果开发者申请邓白氏编码教程

热门文章

  1. 多媒体技术基础知识——简要知识点
  2. android蓝牙传文件开发,Android Bluetooth文件传输
  3. PHP解析js的escape()函数编码数据
  4. 入门android开发
  5. 5.5.1 jmeter组件-取样器-HTTP请求
  6. Mysql 各个版本区别及官网下载
  7. 【Linux网络编程】epoll进阶之水平模式和边沿模式
  8. 发明计算机作文300字,发明作文300字
  9. 常见的http状态消息
  10. 页面布局的几种宽度设置方式—html