转载自:
https://www.jianshu.com/p/923aebd31b65
https://www.jianshu.com/p/ee8040e56df5

Dalvik虚拟机

Dalvik虚拟机( Dalvik Virtual Machine ),是由Dan Bornstein编写的,DVM是Google专门为Android平台开发的虚拟机,它运行在Android运行时库中。需要注意的是DVM并不是一个Java虚拟机(以下简称JVM)

Dalvik虚拟机采用的是JIT(Just-In-Time)编译模式,意思为即时编译,我们知道apk被安装到手机中时,对应目录会有dex或odex和apk文件,apk文件存储的是资源文件,而dex或odex(经过优化后的dex文件内部存储class文件)内部存储class文件,每次运行app时虚拟机会将dex文件解释翻译成机器码,这样才算是本地可执行代码,之后被系统运行。

Dalvik虚拟机负责解释dex文件为机器码,如果我们不做处理的话,每次执行代码,都需要Dalvik将dex代码翻译为微处理器指令,然后交给系统处理,这样效率不高。为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。

安卓虚拟机ART

Android4.4版本以前是Dalvik虚拟机,4.4版本开始引入ART虚拟机(Android Runtime)。在4.4版本上,两种运行时环境共存,可以相互切换,但是在5.0版本以后,Dalvik虚拟机(简称DVM)则被彻底的丢弃,全部采用ART。

ART(Android Runtime) 是一种执行效率更高且更省电的运行机制,执行的是本地机器码,这些本地机器码是从dex字节码转换而来。

ART采用的是AOT(Ahead-Of-Time)编译,应用在第一次安装的时候,字节码就会预先编译成机器码存储在本地。在App运行时,ART模式就较Dalvik模式少了解释字节码的过程,所以App的运行效率会有所提高,占用内存也会相应减少。谷哥在5.0以后的Android版本中默认了ART模式启动,就是希望Android能摆脱卡顿这个毛病。

ART和Dalvik的区别

  • Dalvik每次都要编译再运行,ART只会安装时启动编译
  • ART占用空间比Dalvik大(原生代码占用的存储空间更大),就是用“空间换时间”
  • ART减少编译,减少了CPU使用频率,使用明显改善电池续航
  • ART应用启动更快、运行更快、体验更流畅、触感反馈更及时

ART、Dalvik、AOT、JIT四个名称的关系

  • JIT代表运行时编译策略,也可以理解成一种运行时编译器,是为了加快Dalvik虚拟机解释dex速度提出的一种技术方案,来缓存频繁使用的本地机器码
  • AOT可以理解为一种编译策略,即运行前编译,ART虚拟机的主要特征就是AOT
  • ART和Dalvik都算是一种Android运行时环境,或者叫做虚拟机,用来解释dex类型文件。但是ART是安装时解释,Dalvik是运行时解释

Dalvik与JVM的区别

DVM之所以不是一个JVM ,主要原因是DVM并没有遵循JVM规范来实现。
基于的架构不同
执行的字节码不同

  • 1.java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码;传统的Java程序经过编译,生成Java字节码保存在class文件中,java虚拟机通过解码class文件中的内容来运行程序。而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中Dalvik虚拟机通过解释Dex文件来执行这些字节码。

  • 2.Dalvik可执行文件体积更小。SDK中有一个叫dx的工具负责将java字节码转换为Dalvik字节码。

  • 3.java虚拟机与Dalvik虚拟机架构不同。java虚拟机基于栈架构。程序在运行时虚拟机需要频繁的从栈上读取或写入数据。这过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间,对于像手机设备资源有限的设备来说,这是相当大的一笔开销。Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式快的多.

更多相关文章

  1. 个性缩放图片NinePatchDrawable
  2. Android(安卓)ART运行环境下Image文件格式简析
  3. Android开发:Android虚拟机启动错误Can't find 'Linux version '
  4. Android可执行文件
  5. android 如何把apk放进系统------unyaffs
  6. Android内核开发:为什么刷机后系统第一次启动会很慢?
  7. Android(安卓)2.2开始resources.arsc有改变
  8. Android之telnet编程
  9. Android为什么要用JAVA做应用开发语言而不用C/C++

随机推荐

  1. Android以后会胜出其他Linux的手机平台
  2. 让我们一起来做最漂亮的Android界面
  3. Eclipse下搭建android开发环境
  4. android数据库持久化框架
  5. Studio报错 You need to use a Theme.App
  6. 【Android】如何快速构建Android Demo
  7. .Net 转战 Android 4.4 日常笔记(7)--apk的
  8. 【Android】手机端的投射
  9. 微信的研究
  10. Android下实现tab页个人比较推崇的方法