专栏首页木溪知识加油站笔记——JVM、DVM(dalvik)和ART之间的区别(二十)

笔记——JVM、DVM(dalvik)和ART之间的区别(二十)

——个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主与书籍精华

1、什么是JVM?

JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的.class字节码文件,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但JAVA编译后生成的.class字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。

JVM运行在操作系统上,屏蔽了底层实现的差异,从而有了JAVA吹嘘的平台独立性和Write Once Run Anywhere。根据JVM规范实现的具体虚拟机有几十种,主流的JVM包括Hotspot、Jikes RVM等,都是用C/C++和汇编编写的,每个JRE编译的时候针对每个平台编译,因此下载JRE(JVM、Java核心类库和支持文件)的时候是分平台的,JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。

2、什么是DVM?

Android 运行环境主要指的Dalvik虚拟机技术,也就是安卓虚拟机DVM。Android中的所有Java程序都是运行在DVM上的,每个Android应用进程对应着一个独立的Dalvik虚拟机实例并在其解释下执行。DVM没有遵循Java虚拟机规范,不能直接执行Java的.class文件,而是执行.dex文件。它使用的是寄存器架构而不是JVM中常见的栈架构。其中.dex(Dalvik Executable)文件是通过.class文件转化而来,安卓使用Java语法编写应用程序,可以直接使用大部分的Java API等。

虽然DVM也是用Java编程语言,Dalvik虚拟机和一般JAVA虚拟机(Java VM)并不兼容,他们两个的区别是JVM标准执行的是.class的字节码(bytecode ),而是DVM执行的是其专有的(.dex)执行文件。在编译过程中,Java把类编译成一个或多个.class字节码文件,然后打包到jar中。JVM会从jar文件中获得相应的.class文件和jre字节码。DVM虽然也是是用Java语言进行编程, Java程序通过编译后,还需要通过SDK中的dex工具.class文件转化打包成.dex格式文件,DVM再从其中读取指令和数据。

JVM与DVM 二者最大的区别在于JVM是以基于栈的虚拟机(Stack-based),而DVM是基于寄存器的虚拟机(Register-based)。基于寄存器的虚拟机虽然比基于堆栈的虚拟机在硬件通用性上要差一些,但是它的代码执行效率却更好。 显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。DVM非常适合在移动终端上使用,与PC相比,它不需要很快的CPU和大量的内存空间. Google的测算显示,64MB的内存已经能让系统正常运转了。 其中24MB被用于底层系统的初始化和启动。另外20MB被用于启动高层服务。

Java类文件在编译过后,会产生至少一个.class文件包含大量冗余信息,dex文件格式会把所有 的.class文件内容整合到一个.dex文件中。通常一个应用apk只有一个classes.dex,但是开启了multiDexEnabled true分包可以生成多个.dex文件。即减少了整体文件的尺寸和IO操作,也提高了类的查找速度。增加了对新的操作码的支持,使文件结构尽量简洁,使用等长的指令,借以提高解析速度。

3、什么是ART虚拟机,和JVM/DVM有什么不同?

ART(Android Runtime)是Android 4.4发布的,用来替换Dalvik虚拟,Android 4.4之前默认采用的还是DVM,系统会提供一个选项来开启ART模式。在Android 5.0时,默认采用ART,DVM从此退出历史舞台。

Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码。

Dalvik执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,但是将dex字节码翻译成本地机器码是发生在应用程序的运行过程中,并且应用程序每一次重新运行的时候,都要重新做这个翻译工作,因此,即使采用了JIT,Dalvik虚拟机的总体性能还是不能与直接执行本地机器码的ART虚拟机相比。 安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包含dex字节码的apk文件。所以在安装应用的时候,dex中的字节码将被编译成本地机器码,之后每次打开应用,执行的都是本地机器码。移除了运行时的解释执行,效率更高,启动更快。(安卓在4.4中发布了ART运行时)

ART优点:

①系统性能显著提升

②应用启动更快、运行更快、体验更流畅、触感反馈更及时

③续航能力提升

④支持更低的硬件

ART缺点

①更大的存储空间占用,可能增加10%-20%

②更长的应用安装时间

1、JVM、DVM、ART的区别

2、深入理解虚拟机——JVM、DVM、ART区别

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 接口的意义(个人笔记)

    很多程序员对于接口存在的意义很疑惑。不知道接口到底是有什么作用,为什么要定义接口。

    紫兮木溪
  • 安卓6.0申请多个动态权限

    说来惭愧,最近在测试一个客户端文件上传的功能;一直在拿模拟器做的调试,对接成功后,文件上传没问题,相安无事;刚好自己用的是安卓机,就直接打包发到真机调试了,文件...

    紫兮木溪
  • 笔记(二十二)——Dagger2使用

    ——个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主与书籍精华 参考见:Android开发之Dagger2--Module&Component(三...

    紫兮木溪
  • JVM规范系列第2章:Java虚拟机结构

    简单地说,就是《JVM规范》中提到的内容,你一定要遵守。但没有提到的内容,你就自由发挥。所以我们要知道,我们经常听到的老年代、年轻代、永久代,其实只是HotSp...

    陈树义
  • 书单丨24岁的Java,到底有多美?

    本书源于影响了全球250万名开发工程师的《阿里巴巴Java开发手册》,作者静心沉淀,对Java规约的来龙去脉进行了全面而彻底的内容梳理。

    博文视点Broadview
  • Java工程师学习指南第8部分:分布式系统理论与实践

    本文整理了微信公众号【Java技术江湖】发表和转载过的分布式相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧。

    Java技术江湖
  • 高级Java程序员值得拥有的10本书

    Java是时下最流行的编程语言之一。市面上也出现了适合初学者的大量书籍。但是对于那些在Java编程上淫浸多时的开发人员而言,这些书的内容未免显得过于简单和冗余了...

    哲洛不闹
  • 传智播客_毕姥爷_2012年毕向东Java基础教程_毕向东老师

    视频百度网盘下载链接:https://pan.baidu.com/s/1bpD3P07#list/path=%2F

    黑泽君
  • Java 架构师成长记

    “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处: ? 1.能出版出来的书一定是经过反复的思考、雕琢和审核的...

    Java高级架构
  • 进BAT这些互联网大厂,面试之前刷几百道面试题真的有用吗?

    面试之前先刷几篇面经,或者做几道热门面试题,想必是大家很熟悉的一种复习方式了,就像我们当年经常做五年高考三年模拟一样。但是可不要把面试题和面经当成你的主要复习...

    美的让人心动

扫码关注云+社区

领取腾讯云代金券