Framework篇 - Dalvik VM、ART VM 和 JVM 的比较

Framework篇 - Dalvik VM、ART VM 和 JVM 的比较_第1张图片

今天来对比下与 Android 有关的3个虚拟机:JVM、Dalvik、ART。

 

目录:

  1. JVM 简述
  2. Dalvik 简述
  3. ART 简述

 

1. JVM 简述 

JVM 是Java Virtual Machine (Java虚拟机) 的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java 语言的一个非常重要的特点就是与平台的无关性。而使用 Java 虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入 Java 语言虚拟机后,Java 语言在不同平台上运行时不需要重新编译。Java 语言使用 Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码 (字节码),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是 Java 的能够"一次编译,到处运行"的原因。

  • JVM 是一个软件,是计算机硬件的一个软件抽象。
  • JVM 运行 Java 字节码,和 C/C++ 不一样,C/C++ 直接在机器上运行,而 Java 多了一层虚拟机。JVM 的作用是把平台无关的 .class 里面的字节码翻译成平台相关的机器码,来实现跨平台。
  • JVM 基于栈,栈架构指令集的主要缺点是执行速度相对来说稍慢一些。栈架构指令集的代码虽然紧凑,但是完成相同功能所需的指令数量一般会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令。
  • HotSpot VM 是 Sun JDK 和 OpenJDK 中所带的虚拟机,也是目前使用范围最广的 Java 虚拟机,当然还有其他基于 JVM 规范的虚拟机。
  • Java 中多个进程共用一个 JVM,启动一个程序就是在 JVM 中开启一个进程。

关于更多 JVM 的内容可以参考这篇文章:JVM篇 - JVM原理。

 

 

2. Dalvik 简述

Dalvik 是 Google 公司自己设计用于 Android 平台的虚拟机。Dalvik 虚拟机是 Google 等厂商合作开发的 Android 移动设备平台的核心组成部分之一。它可以支持已转换为 .dex (即 Dalvik Executable) 格式的 Java 应用程序的运行,.dex 格式是专为 Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik  应用作为一个独立的 Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

很长时间以来,Dalvik 虚拟机一直被用户指责为拖慢安卓系统运行速度不如 IOS 的根源。

  • JVM 运行的是 Java 字节码,Dalvik 虚拟机运行的是 Dalvik 字节码。Java 程序经过编译,生成 Java 字节码保存在 class 文件中,JVM 通过解码 class 文件中的内容来运行程序。而 Dalvik 运行的是 Dalvik 字节码,所有的 Dalvik 字节码由 Java 字节码转换而来,并被打包到一个 DEX (Dalvik Executable) 可执行文件中,Dalvik 通过解释 DEX 文件来执行这些字节码。
  • Dalvik 可执行文件体积更小,对 class 文件进行了压缩和优化,适合于内存和处理速度有限的操作系统。
  • JVM 基于栈,Dalvik 基于寄存器,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。
  • 一个进程对应一个 Dalvik 虚拟机,防止因为虚拟机崩溃导致所有进程都关闭,由 Zygote 进程来实例化 Dalvik。

 

 

3. ART 简述

首先了解 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 是 Android4.4 及之前使用的虚拟机,它使用的是 JIT 技术来进行代码转译。每次执行应用的时候,Dalvik 将程序的代码编译为机器语言执行。随着硬件水平的不断发展以及人们对更高性能的需求,Dalvik 虚拟机的不足日益突出。而应运而生的ART (Android RunTime) 虚拟机,其处理机制根本上的区别是:它采用 AOT 技术,会在应用程序安装时就转换成机器语言,不再在执行时解释,从而优化了应用运行的速度。在内存管理方面,ART 也有比较大的改进,对内存分配和回收都做了算法优化,降低了内存碎片化程度,回收时间也得以缩短。

ART长处:

  • 系统性能显著提升。
  • 应用启动更快、运行更快、体验更流畅、触感反馈更及时。
  • 续航能力提升。
  • 支持更低的硬件。

ART缺点

  • 更大的存储空间占用。
  • 更长的应用安装时间。

 

你可能感兴趣的:(Framework篇,Framework,JVM,Dalvik,ART)