关于Android虚拟机的那些事儿
早前android给人的印象是卡,慢,无;但是从6.0依赖的手机似乎人们不再提android的这些诟病了,无非来一句“不高端”。知道什么原因吗?有同学说,android一个劲的提升内存,和CPU的升级,但这只是其中的表象,为什么会提升内存呢?认识一下Jvm、Dalvik和Art,你将一切都明白了。什么是JVMJVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JA
早前android给人的印象是卡,慢,无;但是从6.0依赖的手机似乎人们不再提android的这些诟病了,无非来一句“不高端”。知道什么原因吗?有同学说,android一个劲的提升内存,和CPU的升级,但这只是其中的表象,为什么会提升内存呢?认识一下Jvm、Dalvik和Art,你将一切都明白了。
什么是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里面的字节码翻译成平台相关的机器码,来实现跨平台。
什么是Dalvik
Android 运行环境主要指的Dalvik虚拟机技术,也就是安卓虚拟机DVM。每个Android应用进程对应着一个独立的Dalvik虚拟机实例并在其解释下执行。Dalvik虚拟机使用的是寄存器架构而不是JVM中常见的栈架构。Dalvik没有遵循Java虚拟机规范,不能直接执行Java的.class文件,而是执行.dex文件。其中.dex(Dalvik Executable)文件是通过.class文件转化而来,安卓使用Java语法编写应用程序,可以直接使用大部分的Java API等。
JVM和Dalvik的区别
- JVM 基于栈,Dalvik 基于寄存器。
- Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex。
JVM与DVM 二者最大的区别在于JVM是以基于栈的虚拟机(Stack-based),而DVM是基于寄存器的虚拟机(Register-based)。基于寄存器的虚拟机虽然比基于堆栈的虚拟机在硬件通用性上要差一些,但是它的代码执行效率却更好。 显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。
Java类文件在编译过后,会产生至少一个.class文件包含大量冗余信息,dex文件格式会把所有 的.class文件内容整合到一个.dex文件中。通常一个应用apk只有一个classes.dex,但是开启了multiDexEnabled true分包可以生成多个.dex文件。即减少了整体文件的尺寸和IO操作,也提高了类的查找速度。增加了对新的操作码的支持,使文件结构尽量简洁,使用等长的指令,借以提高解析速度。
什么是Art
ART(Android Runtime)是Android 4.4发布的,用来替换Dalvik虚拟机,Android 4.4之前默认采用的还是DVM,系统会提供一个选项来开启ART模式。在Android 5.0时,默认采用ART,DVM从此退出历史舞台。
在Dalvik下,应用每次运行都需要通过即时编译器(JIT,Just In Time)
将字节码转换为机器码,即每次都要编译加运行,这一机制并不高效,但让应用安装比较快,而且更容易在不同硬件和架构上运行。
ART完全改变了这种做法,在应用安装时就预编译字节码到机器码,这个过程叫做预编译(AOT,Ahead-Of-Time)
,使其成为真正的本地应用,应用程序执行将更有效率,启动更快。
Dalvik与Art的区别
Dalvik每次都要编译再运行,这就导致需要不断的CPU计算,卡,慢,续航差。
ART优点:
① 系统性能显著提升
② 应用启动更快、运行更快、体验更流畅、触感反馈更及时
③ 续航能力提升
④ 支持更低的硬件
ART缺点
① 更大的存储空间占用,可能增加10%-20%(空间换时间大法)
② 更长的应用安装时间
更多推荐
所有评论(0)