一.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的问题:
- GC时挂起所有线程
- 大而连续的空间紧张
- 内存碎片化严重
ART:
- 要求程序在分配空间的时候标记自身的堆栈,不需要挂起所有程序的线程。
- 提供 LOS :large object space 专供Bitmap使用,从而提高了GC的管理效率和整体性能。
- 有一个moving collector来压缩活动对象,使得内存空间更加紧凑。
参考:
https://www.jianshu.com/p/bdb6c29aca83
https://www.jianshu.com/p/038807ec68c3
http://www.cnblogs.com/jinkeep/p/3818180.html
网友评论