Android再进阶之从Dalvik到ART虚拟机

本文详细介绍了Android虚拟机从Dalvik到ART的演变过程,包括它们的架构差异、运行时堆的管理方式以及垃圾回收机制的不同。特别强调了编译方式的变化,如JIT和AOT的引入,及其对应用性能的影响。
摘要由CSDN通过智能技术生成

众所周知,Android虚拟机不同于Java虚拟机,为了更高的编译速度,没有基于栈,而是基于寄存器。下面就来介绍整个Android虚拟机的演变过程。

自己做个目录。说一下主要的内容,不浪费阅读者的时间。主要讲了DVM到ART的转变。

  • Dalvik虚拟机的简单介绍,它的运行时堆重点介绍了。
  • ART虚拟机的简单介绍,它的运行时堆重点介绍了。
  • GC垃圾回收因为太费时间了,没有说。
  • 区别主要集中介绍了编译的方式的转变,例如:JIT、AOT的引入,以及即时JIT的引入。
Dalvik虚拟机

1.DVM与JVM的区别

  • 基于的架构不同。JVM基于栈,需要的指令更多,导致速度变慢,由于移动设备性能有限,不是很合适。DVM是基于寄存器,指令的数量会减少,但是,指令的会变大,由于,数量减少了。代码数并不会增加很多。
  • 执行的字节码不同。JVM的执行顺序:.java文件->.class文件->.jar文件。DVM执行顺序:.java文件->.class文件->.dex文件。
  • DVM允许在有限的内存中同时运行多个进程。
  • DVM由Zygote创建和初始化。
  • DVM有共享机制。
  • DVM早期没有使用JIT编译器。
  1. DVM的运行时堆
  • DVM的运行时堆使用标记—清除算法进行GC,它由两个Space以及多个辅助数据结构组成,两个Space分别是ZygoteSpace和Allocation Space,Zygote进程fork第一个子进程之前,会把ZygoteSpace分成两个部分,原来的已经被使用的那部分对依旧叫ZygoteSpace,而未使用的那部分堆就叫Allocation Space,以后的对象都会在Allocation Space上进行分配和释放,它不是进程之间共享的。
  • 除了这两个Space,还有以下数结构:
  • Card Table:用于DVM Concurrent GC,当第一次进行垃圾标记后,记录垃圾信息。
  • Heap Bitmap:有两个Heap Bitmap,一个用来记录上次GC存活的对象,另一个用来记录这次GC存活的对象。
  • Mark Stack :DVM的运行时堆使用标记–清除算法进行GC,它用来遍历存活的对象。
ART虚拟机

ART虚拟机是Android 4.4发布的,用来替换Dalvik虚拟机,Android5.0之后默认采用ART虚拟机,DVM退出历史舞台。

  1. ART和DVM的区别
  • 可以看看后面的总结。
  • DVM是为32位CPU设计的,而ART支持64位并且兼容32位CPU。
  • ART对垃圾回收机制进行了改进,比如更频繁地执行并行垃圾收集,将GC暂停由2次减少为1次。
  • ART的运行时堆空间划分和DVM不同。
  1. ART的运行时维
  • ART使用了多种垃圾收集方案,每个方案会运行不同的垃圾收集器,默认是采用CMS方案,该方案主要采用了sticky-CMS和partial-CMS。
  • ART的运行时堆的空间也会有不同的划分,默认是由4个Space和多个辅助数据结构组成的,4个Space分别是Zygote Space、Allocation Space、Image Space和Large Object Space。
  • Zygote Space、Allocation Space和DVM中的作用是一样的,Image Space用来存放一些预加载类,Large Object Space用来分配一些大对象(默认大小为12KB),其中Zygote Space和Image Space是进程间共享的。
  • 除了四个Space,ART的Java堆中,还包括两个Mod Union Table,一个Card Table,两个Heap Bitmap,两个Object Map,以及三个Object Stack。
  1. ART的GC日志。
  • 与DVM不同,ART会为那些主动请求的垃圾收集事件或者认为GC速度慢时才会打印GC日志。
DVM与ART区别总结
  • 首先,为了提高运行的速度,在DVM早期的版本之中引入的JIT编译,对于多次运行的热点代码,会在本地生成机器码,这样在下次运行相同的逻辑代码的时候,直接使用机器码,可以提高运行速度。但是,需要注意的是,应用程序每次重新运行的时候,都需要重新编译这些代码,进行JIT编译。这是在Dalvik虚拟机的版本。
  • 接着,到了ART虚拟机的版本,上面提到了,应用程序每次重新运行的时候,都需要重新编译这些代码。为了解决这个问题,引入了AOT(预编译),系统在安装应用程序的时候会进行一次AOT,将字节码预先编程成机器码,并且存储在本地,这样运行时自然效率大大提高。
  • 然而,预先的编译,虽然提高了运行速度,但是,因为需要进行预编译,应用程序安装的时间大大提升了,而且编译好的机器码占用了大量的本地存储空间。Android7.0,在ART中加入了即时编译器JIT,作为AOT的一个补充,应用程序会在运行的时候,将热点代码编译成机器码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值