精华内容
下载资源
问答
  • Android ART虚拟机和Dalvik虚拟机区别

    千次阅读 2017-12-27 17:01:12
    Android 从5.0开始默认使用ART虚拟机执行程序,抛弃了Dalvik虚拟机.加快了Android的运行效率,提高系统的流畅性原因是Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码, Dalvik虚拟机有一个解释器,用来...

    Android 从5.0开始默认使用ART虚拟机执行程序,抛弃了Dalvik虚拟机.加快了Android的运行效率,提高系统的流畅性

    原因是Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码, Dalvik虚拟机有一个解释器,用来执行dex字节码, Android从2.2开始,通过JIT(Just-In-Time)进行Dalvik虚拟机的优化,将使用频率较高的字节码翻译成机器码,就可以有效地提高Dalvik虚拟机的执行效率。但即使用采用了JIT,Dalvik虚拟机还是比不上ART虚拟机,因为Dalvik翻译工作是在程序运行时的,而ART在APK在安装时就对其包含的Dex字节码进行翻译,得到对应的本地机器指令,于是就可以在运行时直接执行了。

    安装:

    Android系统通过PackageManagerService来安装APK,在安装的过程,PackageManagerService会通过另外一个类Installer的成员函数dexopt来对APK里面的dex字节码进行优化,对Dalvik虚拟机来说只进行dex字节码的优化,而ART虚拟机将dex字节码翻译成本地机器码,注意的是两种虚拟机不管事字节码的优化还是翻译成机器码都会生成一个后缀是odex文件,只不过ART的是一个oat类型文件,什么是oat文件(不清楚,好像是Linux的文件)

    启动:

    Android系统在启动的时候,会创建一个Zygote(受精卵,)进程,一切进程产生的一个进程。Zygote进程在启动的过程中会创建一个Dalvik虚拟机(或是ART虚拟机)。Zygote进程是通过复制自己来创建新的应用程序进程的,他会连同虚拟机一并复制可以大大提高系统的启动速度,就像单例一样,不用再为每个进程new一个,而且每个应用进程所需要的虚拟机也都是直接拿来就可以了.

    展开全文
  • JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

    万次阅读 多人点赞 2015-12-31 11:43:14
    简单介绍JAVA虚拟机,安卓Dalvik虚拟机和ART虚拟机,并做简单对比。

    1、什么是JVM?

    JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但JAVA编译后生成的字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。
    JVM运行在操作系统上,屏蔽了底层实现的差异,从而有了JAVA吹嘘的平台独立性和Write Once Run Anywhere。根据JVM规范实现的具体虚拟机有几十种,主流的JVM包括Hotspot、Jikes RVM等,都是用C/C++和汇编编写的,每个JRE编译的时候针对每个平台编译,因此下载JRE(JVM、Java核心类库和支持文件)的时候是分平台的,JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。


    2、什么是DVM,和JVM有什么不同?

    JVM是Java Virtual Machine,而DVM就是 Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进程里,每个进程对应着一个Dalvik虚拟机实例。他们都提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能,各自拥有一套完整的指令系统,以下简要对比两种虚拟机的不同。

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

    ②Dalvik可执行文件体积更小
    以下是JVM规范中以C的数据结构表达的class文件结构,class文件被虚拟机加载到内存中后便是这样

    class文件中包含多个不同的方法签名,如果A类文件引用B类文件中的方法,方法签名也会被复制到A类文件中(在虚拟机加载类的连接阶段将会使用该签名链接到B类的对应方法),也就是说,多个不同的类会同时包含相同的方法签名,同样地,大量的字符串常量在多个类文件中也被重复使用,这些冗余信息会直接增加文件的体积,而JVM在把描述类的数据从class文件加载到内存时,需要对数据进行校验、转换解析和初始化,最终才形成可以被虚拟机直接使用的JAVA类型,因为大量的冗余信息,会严重影响虚拟机解析文件的效率。
    为了减小执行文件的体积,安卓使用Dalvik虚拟机,SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,dx工具对JAVA类文件重新排列,将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享同一个常量池,使得相同的字符串、常量在DEX文件中只出现一次,从而减小了文件的体积。
    dx工具的转换过程和DEX文件的结构如下图所示。


    ③JVM基于栈,DVM基于寄存器
    JAVA虚拟机基于栈结构,程序在运行时虚拟机需要频繁的从栈上读取写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费很多CPU时间。
    Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。

    public class Hello {
        public int foo(int a, int b) {
            return (a + b) * (a - b);
        }
    
        public static void main(String[] args) {
            Hello t = new Hello();
            System.out.print(t.foo(5, 3));
        }
    }



    以这段代码中的foo方法为例,编译成class文件后,反编译class文件查看JAVA字节码:
    Code:
             0: iload_1
             1: iload_2
             2: iadd
             3: iload_1
             4: iload_2
             5: isub
             6: imul
             7: ireturn



    同样代码的foo方法,编译生成dex文件后,查看Dalvik字节码:
            
             0000: add-int  v0, v3, v4
             0002: sub-int  v1, v3, v4
             0004: mul-int/2addr  v0, v1
             0005: return  v0


    由以上字节码对比,代码指令减少了,执行速度当然也会更快。
    下图为两种虚拟机分别执行自己的字节码的过程对比。



    3、什么是ART虚拟机,和JVM/DVM有什么不同?

    首先了解JIT(Just In Time,即时编译技术)和AOT(Ahead Of Time,预编译技术)两种编译模式。

    JIT以JVM为例,javac把程序源码编译成JAVA字节码,JVM通过逐条解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译,执行速度必然比C/C++编译后的可执行二进制字节码程序慢,为了提高执行速度,就引入了JIT技术,JIT会在运行时分析应用程序的代码,识别哪些方法可以归类为热方法,这些方法会被JIT编译器编译成对应的汇编代码,然后存储到代码缓存中,以后调用这些方法时就不用解释执行了,可以直接使用代码缓存中已编译好的汇编代码。这能显著提升应用程序的执行效率。(安卓Dalvik虚拟机在2.2中增加了JIT)
    相对的AOT就是指C/C++这类语言,编译器在编译时直接将程序源码编译成目标机器码,运行时直接运行机器码。

    Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码

    Dalvik执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,但是将dex字节码翻译成本地机器码是发生在应用程序的运行过程中,并且应用程序每一次重新运行的时候,都要重新做这个翻译工作,因此,及时采用了JIT,Dalvik虚拟机的总体性能还是不能与直接执行本地机器码的ART虚拟机相比。

    安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包含dex字节码的apk文件。所以在安装应用的时候,dex中的字节码将被编译成本地机器码,之后每次打开应用,执行的都是本地机器码。移除了运行时的解释执行,效率更高,启动更快。(安卓在4.4中发布了ART运行时)

    ART优点:
    ①系统性能显著提升
    ②应用启动更快、运行更快、体验更流畅、触感反馈更及时
    ③续航能力提升
    ④支持更低的硬件

    ART缺点
    ①更大的存储空间占用,可能增加10%-20%
    ②更长的应用安装时间

    总的来说ART就是“空间换时间”
    展开全文
  • Android4.4版本以前是Dalvik虚拟机,4.4版本开始引入ART虚拟机(Android Runtime)。在4.4版本上,两种运行时环境共存,可以相互切换,但是在5.0版本以后,Dalvik虚拟机则被彻底的丢弃,全部采用ART。 总之,一句话...

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

    总之,一句话总结就是:采用ART预先加载代替用时查找以提升应用的性能。

    ART

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

    Dalvik

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

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

    两者的区别

    • Dalvik每次都要编译再运行,Art只会安装时启动编译

    • Art占用空间比Dalvik大(原生代码占用的存储空间更大),就是用“空间换时间”

    • Art减少编译,减少了CPU使用频率,使用明显改善电池续航

    • Art应用启动更快、运行更快、体验更流畅、触感反馈更及时

    ART优缺点

    优点

    • 系统性能的显著提升

    • 应用启动更快、运行更快、体验更流畅、触感反馈更及时

    • 更长的电池续航能力

    • 支持更低的硬件

    缺点

    • 更大的存储空间占用,可能会增加10%-20%

    • 更长的应用安装时间

    附注

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

      • JIT代表运行时编译策略,也可以理解成一种运行时编译器,是为了加快Dalvik虚拟机解释dex速度提出的一种技术方案,来缓存频繁使用的本地机器码

      • ART和Dalvik都算是一种Android运行时环境,或者叫做虚拟机,用来解释dex类型文件。但是ART是安装时解释,Dalvik是运行时解释

      • AOT可以理解为一种编译策略,即运行前编译,ART虚拟机的主要特征就是AOT

    • Android 为什么要使用虚拟机?

      Android 使用虚拟机作为其运行环境是为了运行 APK 文件构成的 Android 应用。它的优点有:

      • 应用代码和核心的操作系统分离。所以即使任意一个程序中包含恶意的代码也不会直接影响系统文件。这使得 Android 操作系统更稳定可靠。

      • 提高了跨平台兼容性或者说平台独立性。这意味着即使某一个应用是在 PC 上编译的,它也可以通过虚拟机在移动平台上执行。

     

     

     

     

     

     

     

     

    展开全文
  • ART登场,Android要核心虚拟机Dalvik说再见了Dalvik是Android的核心组成部分之一,Android上的应用程序需要依靠它才可以正常运行。现在Google准备用新的运行环境ART来替代它。在最新的Android4.4上,有两个运行...
  • Dalvik和ART虚拟机的区别

    千次阅读 2017-07-10 11:54:38
    Dalvik和ART虚拟机

           Dalvik是Google开发运行在Android平台的Java虚拟机, Android编译后生成dex文件。Dalvik虚拟机下运行Java时,要将字节码通过即时编译器(just in time ,JIT)转换为机器码(机器码才是能真正运行的),这会拖慢应用的运行效率。

          所以Google开发了新的虚拟机叫ART(Android Runtime),应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速。

           ART分为2种模式, 即解释模式和AOT机器码模式。  

           解释模式类似于JavaScript, 就是取出Dex代码并逐条解释,运行仍然会慢;

         机器码模式就是在安装app时就编译好Dex对应的机器码,运行很快, 这是Android5.0及后续版本的默认方式。

    我们知道Android编译后生成dex文件, 真正运行时要在执行loadDex后调用dexopt(dalvik)或dexoat(ART)得到odex文件, 即dex不能被ART虚拟机直接运行!


         可以忘掉Dalvik了, 因为Google已经抛弃了它! 有精力可以好好研究一下ART。



             这是Android7.1.1的代码, 一级目录有art和dalvik, 就是对应虚拟机的代码目录。         


    展开全文
  •  Java文件通过javac编译成.class文件,然后通过SDK中的dx工具将.class文件转换成Dalvik虚拟机能够执行的.dex文件,然后与Native code(JNI)资源文件一起打包成apk,apk安装到手机后解压出.dex文件,Dalvik虚拟机会...
  • 为了减小执行文件的体积,安卓使用Dalvik虚拟机,SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,dx工具对JAVA类文件重新排列,将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池...
  • Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存...
  • 从本质上讲,虚拟机是个被构建来提供特定或通用目的服务环境的非实体计算机,Java虚拟机它是解决跨平台服务的载体,是字节码底层平台之间的桥梁。主要负责完成对象生命周期管理、堆栈管理、线程管理、安全异常...
  • 而在ART环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。...
  • 想了解 dalvik 虚拟机和 Art 虚拟机的优化升级点,就需要先了解  dalvik 和  Art 。 2 第一天 第二天 「小新」第二天参加某奇艺的面试。 面试结束 「小新」 这次痛定思痛,决定把  dalvikArt   虚拟机 搞懂...
  • Art和Dalvik对比以及虚拟机的原理

    千次阅读 2017-03-02 16:07:36
    ART(Andriod RunTime)是Dalvik虚拟机的下一个版本,Dalvik运行的是字节码,而ART运行的是本地的代码,虚拟机的作用就是用来运行系统的应用程序。  ART相较于Dalvik的优势:  1.超前编译:主要用来提升速度与...
  • 安卓运行时从Dalvik虚拟机替换成ART虚拟机。并不要求开发人员又一次将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包括dex字节码的apk文件。   所以在安装应用的时候。dex中的字节码将被...
  • 安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包含dex字节码的apk文件。所以在安装应用的时候,dex中的字节码将被编译成本地机器码...
  • JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的...
  • Android Dalvik虚拟机和ART虚拟机对比 概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀。 Dalvik ...
  • )来检测当前使用的是哪个虚拟机,如果使用的是ART虚拟机的话,属性值会大于等于2.0.0private boolean getIsArtInUse() { final String vmVersion = System.getProperty("java.vm.version"); retur...
  • 安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包含dex字节码的apk文件。所以在安装应用的时候,dex中的字节码将被编译成本地机器码...
  • Dalvik 线程状态对应定义(Android4.4,libcore/libdvm/src/main/java/java/lang/VMThread.java) /** * Holds a mapping from native Thread statuses to Java one. Required for * translating back the result...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,246
精华内容 3,298
关键字:

art虚拟机和dalvik虚拟机