为了活动小家电-Android JVM、DVM、ART(二)

73 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

为了活动小家电,接着上篇搞!

DVM是什么?

image.png

早期的 Android 运行时,google专为Android生态设计的虚拟机,所有安卓程序都运行在安卓系统进程里,每个进程对应着一个Dalvik虚拟机实例,上图说明了创建 APK 的过程。它经历了转换为在 JVM 上运行的 Java 字节码的相同过程,但最后两个步骤不同。

Dex 编译器将类文件更改为 dex 文件并使其在 DVM 中可执行。几个class文件变成一个单独的dex文件,最后将dex和其他包括资源在内的库进行压缩,完成APK(Android应用程序包)。

JVM 被多个应用程序作为单个实例共享和使用,但 DVM 被设计为作为多个实例运行,因此它的运行效率更高,并为应用程序提供了自己的 VM 实例。自 Android 2.2 以来首次用作跟踪 JIT 编译器。

JIT

  • 因为经常使用的部分是用机器语言预编译和解释的,所以可以提高执行性能。
  • 在运行时开始解释。

它是为了弥补解释器方法的缺点而引入的 JIT 编译器。它是一种在解释器方法中执行的方法,在适当的时候编译整个字节码,将其更改为本机代码,然后直接作为本机代码执行,无需进一步解释。由于本机代码保存在缓存中,因此编译一次的代码执行速度很快。当然,JIT 编译器编译的过程比解释字节码的时间要长得多,所以如果只执行一次代码,不编译就解释是有利的。因此,使用 JIT 编译器的 JVM 会在内部检查该方法的执行频率,并且仅在它超过某个级别时才进行编译。

什么是跟踪 JIT?

如果超过阈值,则字节码被解释为机器语言。也就是说,如果某个部分(例如 if 语句,for 语句)重复超过一定次数,则编译。

总结

在 Android 中使用 DVM 的最大原因之一是它使用基于寄存器的模型,而不是 JVM 使用的基于堆栈的模型。基于堆栈的模型需要大量内存,无法在 Android 上获得快速性能。由于基于寄存器的模型需要较少的内存使用,因此可以快速运行。

为了活动小家电,下篇继续搞。