Android中的Dalvik和ART详解及区别分析

 更新时间:2016年07月16日 15:00:56   投稿:daisy  
小编通过这篇文章给大家整理了什么是Dalvik和ART,并进行了区别的分析,下面一起来看看。

要想知道Dalvik和ART区别分析,首先我们要分别知道这两者是什么?

什么是Dalvik?
Dalvik是Google公司自己设计用于Android平台的虚拟机。
Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。
它可以支持已转换为 .dex格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。
Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
很长时间以来,Dalvik虚拟机一直被用户指责为拖慢安卓系统运行速度不如IOS的根源。
2014年6月25日,Android L 正式亮相于召开的谷歌I/O大会,Android L 改动幅度较大,谷歌将直接删除Dalvik,代替它的是传闻已久的ART。

什么是ART?
即Android Runtime
ART 的机制与 Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速。

下面是区别分析

Dalvik和JVM有啥关系?
主要区别:
Dalvik是基于寄存器的,而JVM是基于栈的。
Dalvik运行dex文件,而JVM运行java字节码
自Android 2.2开始,Dalvik支持JIT(just-in-time,即时编译技术)。
优化后的Dalvik较其他标准虚拟机存在一些不同特性: 
1.占用更少空间 
2.为简化翻译,常量池只使用32位索引  
3.标准Java字节码实行8位堆栈指令,Dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的“虚拟寄存器”区。这样减少了Dalvik的指令计数,提高了翻译速度。 
 当Android启动时,Dalvik VM 监视所有的程序(APK),并且创建依存关系树,为每个程序优化代码并存储在Dalvik缓存中。Dalvik第一次加载后会生成Cache文件,以提供下次快速加载,所以第一次会很慢。
 Dalvik解释器采用预先算好的Goto地址,每个指令对内存的访问都在64字节边界上对齐。这样可以节省一个指令后进行查表的时间。为了强化功能, Dalvik还提供了快速翻译器(Fast Interpreter)。

一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。

Dalvik虚拟机既不支持Java SE 也不支持Java ME类库(如:Java类,AWT和Swing都不支持)。 相反,它使用自己建立的类库(Apache Harmony Java的一个子集)。

ART有什么优缺点呢?
优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。
缺点:
1.机器码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%(不过在应用包中,可执行的代码常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是代码只有 6.9 MB。)
2.应用的安装时间会变长。

tips:现在智能手机大部分都可以让用户选择使用Dalvik还是ART模式。当然默认还是使用Dalvik模式。
用法:设置-辅助功能-开发者选项(开发人员工具)-选择运行环境(不同的手机设置的步骤可能不一样)。

Dalvik和ART的几点区别
dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小
ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大
用个比喻来说就是,骑自行车
dalvik 是已经折叠起来的自行车,每次骑都要先组装自行车才能骑
ART 是已经组装好的自行车,每次骑直接上车就能走人

相关文章

  • Android Studio 下载视频到本地

    Android Studio 下载视频到本地

    这篇文章主要介绍了Android Studio 下载视频到本地,利用GreenDao实现多线程断点续传,这样的话,下次用户再次下载时,将继续上次数据库的接着下载,这样用户体验就会很好,也大大节省了成本.具体实现代码大家参考下本文
    2018-03-03
  • 史上最全的Android build.gradle配置教程

    史上最全的Android build.gradle配置教程

    这篇文章主要给大家介绍了关于Android build.gradle配置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Android中backgroundDimEnabled的作用

    Android中backgroundDimEnabled的作用

    这篇文章主要介绍了Android中backgroundDimEnabled的作用的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Android图表库HelloCharts的实例详解

    Android图表库HelloCharts的实例详解

    这篇文章主要介绍了Android中的图标库HelloCharts的一些简单使用实例,文中的示例代码讲解详细,对我们学习有一定的参考价值,需要的可以参考一下
    2022-01-01
  • Android编程简单获取网络上的图片

    Android编程简单获取网络上的图片

    这篇文章主要介绍了Android编程简单获取网络上的图片,结合实例形式分析了Android获取网络图片及加载显示的相关操作步骤与注意事项,需要的朋友可以参考下
    2016-10-10
  • Android开发使用ProgressBar实现进度条功能示例

    Android开发使用ProgressBar实现进度条功能示例

    这篇文章主要介绍了Android开发使用ProgressBar实现进度条功能,结合实例形式分析了Android进度条ProgressBar的具体样式、布局与功能实现技巧,需要的朋友可以参考下
    2019-03-03
  • android 网络连接处理分析

    android 网络连接处理分析

    在Android中,可以有多种方式来实现网络编程,本文将详细介绍android 网络连接处理,需要了解的朋友可以参考下
    2012-11-11
  • Android实现带指示器的自动轮播式ViewPager

    Android实现带指示器的自动轮播式ViewPager

    这篇文章主要为大家详细介绍了Android实现带指示器的自动轮播式ViewPager的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android Flutter实现3D动画效果示例详解

    Android Flutter实现3D动画效果示例详解

    在Flutter中提供了AnimatedWidget组件用于构建可复用的动画组件。本文我们用AnimatedWidget来实现组件的3D旋转效果,感兴趣的可以了解一下
    2022-03-03
  • Android 通过webservice上传多张图片到指定服务器详解

    Android 通过webservice上传多张图片到指定服务器详解

    这篇文章主要介绍了Android 通过webservice上传多张图片到指定服务器详解的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论