美文网首页
JVM DVM ART

JVM DVM ART

作者: 小小卒_oO_ | 来源:发表于2019-03-14 16:01 被阅读0次

    一.Java -> JVM

    JAVA为每一个平台开发一个 JVM,即 Java 虚拟机。Java 编译器将 .java 文件转换成 .class文件,并提供给 JVM,由 JVM 将它转换成机器码。

    二.Android -> DVM 和 ART

    在 Android 中,Java 类被转换成 DEX 字节码。DEX 字节码通过 ART 或者 Dalvik runtime 转换成机器码。

    • Dalvik 是一个基于 “即时编译器” JIT(Just in time)编译的引擎。每次应用在运行时,JIT 实时的将一部分 Dalvik 字节码翻译成机器码。JIT 只翻译一部分代码,它消耗的更少的内存,占用的更少的物理存储空间。
    • 从 Android 5.0(Lollipop)开始 ART 就全面取代了Dalvik。ART 内置了一个 Ahead-of-Time(预编译) 编译器(AOT)。在应用的安装期间,他就将 DEX 字节码翻译成机器码并存储在设备的存储器上。不再需要 JIT 编译,代码的执行速度要快得多。

    三.JVM 与 DVM 对比

    1. JVM使用栈架构,DVM使用寄存器架构。

    • 基于栈,意味着需要去栈中读写数据,所需的指令会更多,这样会导致速度慢。
    • 基于寄存器,指令更紧凑更简洁。指令会比基于栈的指令要大,但是由于指令数量的减少,总的代码数不会增加多少。

    2. JVM运行java字节码,DVM运行DEX 字节码。

    DVM会用dx工具将所有的.class文件转换为一个.dex文件。



    如上图所示,.jar文件里面包含多个.class文件,每个.class文件里面包含了该类的常量池、类信息、属性等等。当JVM加载该.jar文件的时候,会加载里面的所有的.class文件,JVM的这种加载方式很慢,对于内存有限的移动设备并不合适。
    而在.apk文件中只包含了一个.dex文件,这个.dex文件里面将所有的.class里面所包含的信息全部整合在一起了,这样再加载就提高了速度。.class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中,减少了I/O操作,提高了类的查找速度。

    3. DVM允许在有限的内存中同时运行多个进程

    在Android中的每一个应用都运行在一个DVM实例中,每一个DVM实例都运行在一个独立的进程空间。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

    四.ART 月 DVM 对比

    ART将字节码变为机器码,占用了更多的空间,因为应用程序每次运行时不用重复编译,节省了能耗。


    ART和DVM在GC上的区别:

    DVM中GC的问题:

    1. GC时挂起所有线程
    2. 大而连续的空间紧张
    3. 内存碎片化严重

    ART:

    1. 要求程序在分配空间的时候标记自身的堆栈,不需要挂起所有程序的线程。
    2. 提供 LOS :large object space 专供Bitmap使用,从而提高了GC的管理效率和整体性能。
    3. 有一个moving collector来压缩活动对象,使得内存空间更加紧凑。

    参考:
    https://www.jianshu.com/p/bdb6c29aca83
    https://www.jianshu.com/p/038807ec68c3
    http://www.cnblogs.com/jinkeep/p/3818180.html

    相关文章

      网友评论

          本文标题:JVM DVM ART

          本文链接:https://www.haomeiwen.com/subject/juaqmqtx.html