虚拟机之Jvm、dalvik、art联系和区别
一、了解JVM
JVM: java virtual machine,缩写JVM,一种能够执行java bytecode的虚拟机器,本质上是一种软件实现,也可以理解成以一条运行java bytecode的底层程序。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
实际上,并不是仅有java源代码,能编译生成.class文件,也就是我们所说的字节码文件,下面是引用一张维基百科的图:
同样,python源码程序,也能最终编译成.class/.jar文件。
二、Jvm、dalvik虚拟机
先看一下JVM和Android虚拟机的区别:
- JVM执行的是.class文件、Dalvik和ART执行的.dex文件。
- class文件有很多冗余信息,dex文件会做去冗余信息的优化。
- 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联系和区别相关推荐
- ART/Dalvik,JVM/Dalvik 虚拟机的区别
从功能上来看,一个高级语言虚拟机主要分为两部分,一个是解释器部分,用来运行高级语言编译生成的ByteCode:还有一部分则是Runtime运行时,用来负责运行时的内存空间开辟.管理等等. JAVA虚拟 ...
- JVM(JAVA虚拟机)、DVM(Dalvik虚拟机)和ART虚拟机
一.什么是DVM,和JVM有什么不同? JVM是Java Virtual Machine,而DVM就是Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进 ...
- 【Java 虚拟机原理】动态字节码技术 | Dalvik ART 虚拟机 | Android 字节码打包过程
文章目录 一.动态字节码技术 二.Dalvik & ART 虚拟机 三.Android 字节码打包过程 总结 一.动态字节码技术 动态字节码技术 就是在 运行时 , 动态修改 Class 字节 ...
- 移动安全--7--JVM / Dalvik / ART虚拟机
7-1.关于Dalvik和ART虚拟机 1.Android4.4之前的Android运行时是Dalvik虚拟机.它使用即时编译. 2.Android4.4中引入了ART虚拟机,但默认的Android运 ...
- dalvik模式和art模式的区别
dalvik模式和art模式的区别: dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小 ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用 ...
- 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记
前言 我在读 深入理解java虚拟机 这本书,把整体其中的关键点标记了,希望自己对它有个不一样的理解,也希望大家能看看这本写的很好的书 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) pd ...
- Java虚拟机(JVM)面试题大集合
Java虚拟机(JVM) Java内存区域 说一下 JVM 的主要组成部分及其作用? 说一下 JVM 运行时数据区 深拷贝和浅拷贝 说一下堆栈的区别? 队列和栈是什么?有什么区别? HotSpot虚拟 ...
- 《深入理解java虚拟机》(Jvm)一篇概括
目录 1.Java内存区域与内存溢出异常 2.垃圾收集器与内存分配策略 3.虚拟机性能监控与故障处理工具 4.调优案例分析与实战 5.类文件结构 6.虚拟机类加载机制 7.虚拟机字节码执行引擎 8.类 ...
- 【2022最新Java面试宝典】—— Java虚拟机(JVM)面试题(51道含答案)
目录 一.Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 2. 为什么说java是跨平台语言 3. Jdk和Jre和JVM的区别 4. 说一下 JVM由那些部分组成,运行流程 ...
- 深入理解Java虚拟机:jvm内存模型jdk1.8
深入理解Java虚拟机:jvm内存模型jdk1.8 一.程序计数器 使用PC寄存器存储字节码指令地址有什么作用?为什么使PC寄存器记录当前线程的执行地址? PC寄存器为什么会被设定为线程私有? 二.J ...
最新文章
- 源码解析 使用tomcat作为web容器时,用到的外观模式
- CSS之Background-size:cover
- 利用Python编辑一个发送邮件的脚本
- 老BOJ 13 K-based Numbers
- java多线程之Concurrent包
- OpenCV学习笔记(九): 漫水填充:floodFill()
- 信息学奥赛一本通 1010:计算分数的浮点数值 | OpenJudge NOI 1.3 05
- C语言课后习题(61)
- 三星计算机用户的密码忘了,如果三星计算机忘记了开机密码怎么办
- 番茄花园 Ghost XP SP3 极速装机版 V2013.05
- SmartAdmin(SmartAdmin_v1.5.2)
- 都有哪些查找和下载英文文献的方法?
- 使用ssh连接虚拟机保姆级教程
- PUBG 绝地逃亡 吃鸡压枪宏 彩虹六号压枪宏 Autohotkey
- Excel如何将一列数据转为一行?
- Ubuntu离线网卡驱动安装
- Idea报错: A JNI error has occurred
- 计算机应用基础单选题10an,计算机应用基础10考(附答案).doc
- blender学习日志
- 病毒、木马、蠕虫与恶意代码关键点