Dalvik、Art虚拟机

一、什么是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倍了左右。

你可能感兴趣的:(Dalvik、Art虚拟机)