一、什么是Dalvik虚拟机
Dalvik是Google为Android平台设计的Java虚拟机,是Android平台的重要组成部分,支持dex格式的Java程序运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。
Dalvik虚拟机主要负责完成对象生命周期管理,堆栈管理、线程管理、安全和异常管理,以及垃圾回收等等。Dalvik早期并没有JIT编译器,知道Android2.2才加入对JIT的技术支持。
2、Dalvik的特点
- 体积小、占用内存小
- 专有dex可执行文件格式,体积更小,执行速度更快
- 常量池采用32位索引值,寻找类方法名、字段名、常量更快
- 基于寄存器架构,拥有一套完整的指令系统
- 提供对象生命周期管理,堆栈管理、线程管理、安全和异常管理,以及垃圾回收等重要功能
- Android程序都运行在Android系统进程中,每一个进程对应一个Dalvik虚拟机实例
3、Dalvik虚拟机跟Java虚拟机的区别
Java虚拟机运行的是Java字节码,Dalvik虚拟机运行是Dalvik字节码
。Java程序通过编译生成.class文件,Java虚拟机通过解码.class文件内容来运行程序;Dalvik字节码是由Java字节码转化来的,并打包到.dex可执行文件中,Dalvik虚拟机通过解释.dex文件来执行程序。Dalvik可执行文件体积小
。Android SDK中有一个叫dx的工具负责将Java字节码转换为Dalvik字节码。dx工具会对Java类文件重新排序,消除其中的冗余信息,重新组合形成一个常量池,所有类文件共享一个常量池。由于dx工具对常量池的压缩,使得相同的字符串,常量在DEX文件中只出现一次,从而减小了文件的体积。Java虚拟机基于栈架构,Dalvik虚拟机基于寄存器架构
。
4、什么是ART虚拟机
ART 代表
Android Runtime
,其处理应用程序方式不同于Dalvik,Dalvik是依靠一个Just-In-Time (JIT)
编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运 行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)
编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。
ART的优点
- 1、系统性能的显著提升。
- 2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
- 3、更长的电池续航能力。
- 4、支持更低的硬件。
ART的缺点
- 1、更大的存储空间占用,可能会增加10%-20%。
- 2、更长的应用安装时间。
5、Dalvik和ART虚拟机的区别:
1、垃圾回收机制
Dalvik
的GC的过程.主要有有四个过程:
1
、当gc被触发时候,其会去查找所有活动的对象,这个时候整个程序与虚拟机内部的所有线程就会挂起,这样目的是在较少的堆栈里找到所引用的对象.需要注意的是这个回收动作和应用程序非并发。
2
、gc对符合条件的对象进行标记
3
、gc对标记的对象进行回收
4
、恢复所有线程的执行现场继续运行
dalvik这么做的好处是,当pause了之后,GC势必是相当快速的.但是如果出现GC频繁并且内存吃紧势必会导致UI卡顿,掉帧.操作不流畅等。
ART
改善了这种GC方式 , 主要的改善点在将其非并发过程改变成了部分并发。
当ART GC发生时:
1
、GC将会锁住Java堆,扫描并进行标记
2
、标记完毕释放掉Java堆的锁,并且挂起所有线程
3、
GC对标记的对象进行回收
4、
恢复所有线程的执行现场继续运行
5、
重复2-4直到结束
可以看出整个过程做到了部分并发使得时间缩短.据官方测试数据说gc效率提高2倍
2、内存管理
Dalvik
内存管理的特点:内存碎片化严重,Mark and Sweep算法带来的弊端,每次GC后内存千疮百孔,本来连续分配的内存变得碎片化严重,之后再分配对象内存地址变得困难
ART
的解决:在art中,它将Java分了一块空间命名为Large-object-space,这块内存空间引入用来专门存放large-object。同时ART又引入了moving collector的技术,即将不连续的物理内存块进行对齐.对齐了后内存碎片化就得到了很好的解决.Large-Object-Space的引入一是因为moving collector对大块内存的位移时间成本太高,而且提高内存的利用率。根官方统计,ART的内存利用率提高10倍了左右。