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

56 阅读2分钟

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

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

JVM和DVM

JVM 和 DVM 都具有相似的特征,因为它们是使用 Java 的 VM。

image.png

二者之间的区别是什么?

  • 架构角度不同: JVM是基于栈的,对于内存和处理器速度较为有限的移动设备而言不适合。但是DVM是基于寄存器的架构,执行特有的dex文件,在执行效率上确实相对较快。
  • 执行字节码不同: JVM运行的是JAVA字节码,DVM运行的是Dalvik字节码,Dalvik字节码由JAVA字节码转换而来。.dex文件将所有APK中的.class里边所包含的信息全部整合在一起,DVM通过解释DEX文件来执行这些字节码。
  • GC算法不同: JVM可能会采用复制、标记清除、标记整理、分代收集等多种垃圾收集算法。而DVM运行时堆仅使用标记清除算法,这样就导致了内存碎片问题,影响移动设备的性能。

为什么在使用 JAVA 时使用 DVM 而不是 JVM?

  • 许可问题,早年间因使用一些 Java API 而被 Oracle 起诉,结果败诉,Google 需要一个新的虚拟机来避免在 Android 上使用 JVM 时可能出现的许可问题,该虚拟机将作为开源提供。虽然 JVM 是免费的,但它是 GPL 授权的,而且大部分与 Android 相关的内容都在 Apache 授权下,所以 JVM 不适合。
  • 移动环境:电池、计算能力和内存的限制,基于寄存器的DVM在效率上有明显的优势,所以更为适合使用在移动设备端。
  • DVM是经过优化之后的Android专属虚拟机,由于Android app是需要独立运行在一个进程中的,在有限的内存中实现多个虚拟机的运行,并且app crash不会影响到其他进程。
  • JVM不同的应用进程是独立的,即使是同一个类也无法跨进程共享资源,而DVM存在预加载共享机制,可以共享相同的类,这样效率也就提高了。

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