一、了解JVM

JVM: java virtual machine,缩写JVM,一种能够执行java bytecode的虚拟机器,本质上是一种软件实现,也可以理解成以一条运行java bytecode的底层程序。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

实际上,并不是仅有java源代码,能编译生成.class文件,也就是我们所说的字节码文件,下面是引用一张维基百科的图:

同样,python源码程序,也能最终编译成.class/.jar文件。

二、Jvm、dalvik虚拟机

先看一下JVM和Android虚拟机的区别:

  1. JVM执行的是.class文件、Dalvik和ART执行的.dex文件。
  2. class文件有很多冗余信息,dex文件会做去冗余信息的优化。
  3. JVM是基于堆栈,Dalvik虚拟机是基于寄存器。

JVM是基于堆栈,Dalvik虚拟机是基于寄存器:

JVM是基于栈的指令会很紧凑,比如一个方法体的执行,需要经过一连串的指令来完成,JVM指令集是没有任何变量的,执行过程中,结合局部变量表,完成方法体指令的执行,过程中实际上需要和内存空间进行不断交互,这也是为什么一个java程序跑起来后,会占用很大的内存的原因。

JVM使用的指令只占一个字节,因而称为字节码。

Dalvik是基于寄存器的指令集(arm指令),需要指定源地址和目标地址(理解为变量声明),因此需要更多的指令空间。Dalvik的某些指令需要占用两个字节。

基于栈和基于寄存器的指令集,各有优势,一般来说,执行同样的功能,基于栈需要更多的指令(主要是load和store),而基于寄存器需要更多的指令空间。

下面是一段简单代码的jvm指令集:(紧凑、局部变量区内存交互 占用1个字节)

对应dalvik虚拟机的arm指令集:(指令比jvm指令少、占用不多于4个字节)

为什么Android没有直接使用Jvm虚拟机,而是使用Dalvik虚拟机,单从内存优化角度,就有非常必要的意义。

另外,Dalvik充分的利用了Linux进程的管理的特性,Android手机上,每启动一个应用就独立对应一个虚拟机,多个应用同时运行,就有多个虚拟机,都是独立的进程互不影响。

三、Dalvik和Art虚拟机

dalvik虚拟机:

Dalvik虚拟机,是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。

JIT(just in time)编译器,dalvik虚拟机使用JIT编译,每次apk应用运行时实时将一部分dex编译成机器码,然后被执行。

特点上:消耗更少的内存,占用更少的物理存储空间,类似于每次运行apk程序代码过程,都要从压缩包提取,虽然内存占用少了,物理存储空间少了,CPU的消耗就相对多了。

ART虚拟机:

ART,是Android Runtime的缩写,是一种在Android操作系统上的运行环境,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的(dex)字节码转换为机器码,是Android所使用的一种新的虚拟机。

ART和Dalvik的主要区别是:

Dalvik采用的JIT编译技术,ART采用的AOT编译技术,AOT(Ahead of time),ART同时也改善了性能、垃圾回收、应用程序出错以及性能分析。

在apk程序启动过程中:

若Dalvik虚拟机,JIT通过连续不断的性能分析来优化程序代码的执行,在程序运行的过程中,Dalvik虚拟机需要不断将dex字节码编译成机器码。

若ART虚拟机,ART引入了AOT预编译技术,在应用程序安装的过程中,AOT就将所有的dex字节码编译成了机器码,应用程序运行过程中,不需要实时的做编译工作,直接调用即可。

因此,ART极大的提升了应用程序的运行效率,同时也减少了手机的电量消耗,提供了移动设备的续航能力,在垃圾回收机制上,也有很大的提升。

为了保证向下兼容,ART使用了相同的Dalvik字节码文件(dex),即在应用程序目录下保留了dex文件供旧程序调用,然而.odex文件则替换成了可执行与可链接格式(ELF)可执行文件。一旦一个程序被ART的dex2oat命令编译,那么这个程序将会只通过ELF可执行文件来运行。因此,相对于Dalvik虚拟机模式,ART模式下Android应用程序的安装需要消耗更多的时间,同时也会占用更大的内部储存空间,用于储存编译后的代码,但节省了很多Dalvik虚拟机用于实时编译的时间,即运行的时候,效率会更高。

ART这种预编译模式,会造成安装耗时,在Android N实现了一个使用AOT、解释、JIT混合模式的运行环境。

虚拟机之Jvm、dalvik、art联系和区别相关推荐

  1. ART/Dalvik,JVM/Dalvik 虚拟机的区别

    从功能上来看,一个高级语言虚拟机主要分为两部分,一个是解释器部分,用来运行高级语言编译生成的ByteCode:还有一部分则是Runtime运行时,用来负责运行时的内存空间开辟.管理等等. JAVA虚拟 ...

  2. JVM(JAVA虚拟机)、DVM(Dalvik虚拟机)和ART虚拟机

    一.什么是DVM,和JVM有什么不同? JVM是Java Virtual Machine,而DVM就是Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进 ...

  3. 【Java 虚拟机原理】动态字节码技术 | Dalvik ART 虚拟机 | Android 字节码打包过程

    文章目录 一.动态字节码技术 二.Dalvik & ART 虚拟机 三.Android 字节码打包过程 总结 一.动态字节码技术 动态字节码技术 就是在 运行时 , 动态修改 Class 字节 ...

  4. 移动安全--7--JVM / Dalvik / ART虚拟机

    7-1.关于Dalvik和ART虚拟机 1.Android4.4之前的Android运行时是Dalvik虚拟机.它使用即时编译. 2.Android4.4中引入了ART虚拟机,但默认的Android运 ...

  5. dalvik模式和art模式的区别

    dalvik模式和art模式的区别: dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小 ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用 ...

  6. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记

    前言 我在读 深入理解java虚拟机 这本书,把整体其中的关键点标记了,希望自己对它有个不一样的理解,也希望大家能看看这本写的很好的书 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) pd ...

  7. Java虚拟机(JVM)面试题大集合

    Java虚拟机(JVM) Java内存区域 说一下 JVM 的主要组成部分及其作用? 说一下 JVM 运行时数据区 深拷贝和浅拷贝 说一下堆栈的区别? 队列和栈是什么?有什么区别? HotSpot虚拟 ...

  8. 《深入理解java虚拟机》(Jvm)一篇概括

    目录 1.Java内存区域与内存溢出异常 2.垃圾收集器与内存分配策略 3.虚拟机性能监控与故障处理工具 4.调优案例分析与实战 5.类文件结构 6.虚拟机类加载机制 7.虚拟机字节码执行引擎 8.类 ...

  9. 【2022最新Java面试宝典】—— Java虚拟机(JVM)面试题(51道含答案)

    目录 一.Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 2. 为什么说java是跨平台语言 3. Jdk和Jre和JVM的区别 4. 说一下 JVM由那些部分组成,运行流程 ...

  10. 深入理解Java虚拟机:jvm内存模型jdk1.8

    深入理解Java虚拟机:jvm内存模型jdk1.8 一.程序计数器 使用PC寄存器存储字节码指令地址有什么作用?为什么使PC寄存器记录当前线程的执行地址? PC寄存器为什么会被设定为线程私有? 二.J ...

最新文章

  1. 源码解析 使用tomcat作为web容器时,用到的外观模式
  2. CSS之Background-size:cover
  3. 利用Python编辑一个发送邮件的脚本
  4. 老BOJ 13 K-based Numbers
  5. java多线程之Concurrent包
  6. OpenCV学习笔记(九): 漫水填充:floodFill()
  7. 信息学奥赛一本通 1010:计算分数的浮点数值 | OpenJudge NOI 1.3 05
  8. C语言课后习题(61)
  9. 三星计算机用户的密码忘了,如果三星计算机忘记了开机密码怎么办
  10. 番茄花园 Ghost XP SP3 极速装机版 V2013.05
  11. SmartAdmin(SmartAdmin_v1.5.2)
  12. 都有哪些查找和下载英文文献的方法?
  13. 使用ssh连接虚拟机保姆级教程
  14. PUBG 绝地逃亡 吃鸡压枪宏 彩虹六号压枪宏 Autohotkey
  15. Excel如何将一列数据转为一行?
  16. Ubuntu离线网卡驱动安装
  17. Idea报错: A JNI error has occurred
  18. 计算机应用基础单选题10an,计算机应用基础10考(附答案).doc
  19. blender学习日志
  20. 病毒、木马、蠕虫与恶意代码关键点

热门文章

  1. TMS运输管理系统介绍
  2. 在线画树,如何快速画一棵树-Bitree Painter
  3. 黑苹果系统的优化与问题解决(一)
  4. 如果用户没上传头像,则为其设置默认用户头像
  5. SequoiaDB 巨杉数据库应用场景
  6. C#爬虫爬取京东自营笔记本
  7. linux uvc 拍照程序,Linux UVC driver
  8. 【第十一篇】字体设置css变形(transfom)4种
  9. 趣图 | 念念不忘必有回响
  10. “select count (1)”是什么意思?