jvm、dalvik、art区别

JVM 与 dalvik 区别

JVM dalvik
基于栈,必须使用指令来载入和操作栈上数据 基于寄存器,指令更紧凑和简洁
运行的是java字节码 运行的是自己专属的.dex字节码格式
java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据
- 一个应用对应一个Diavik虚拟机实例,独立运行
JVM在运行的时候为每一个类装载字节码 Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类

Dalvik 与 ART 区别

Dalvik ART (5.0 API 21+)
运行时,字节码通过即时编译器(just in time ,JIT)转换为机器码 ART 环境中,应用在 第一次安装的时候,字节码就会预先编译成机器码
- Art占用空间比Dalvik大(原生代码占用的存储空间更大)
用空间换时间
采用垃圾回收算法是 标记-清除算法
垃圾回收会造成 两次暂停(一次在遍历阶段,另一次在标记阶段)
CMS(并发标记清除)方案,启动 GC 后,只有 一次暂停
应用在后台时,会进行 堆压缩,减少内存碎片化
Dalvik 支持 32 位 CPU ART 支持 64 位 并兼容 32 位 CPU

ART GC
ART 默认GC方案是 CMS(并发标记清除)方案,主要使用粘性 CMS、部分 CMS

1、粘性 CMS:不移动分代垃圾回收器
仅扫描堆中上次 GC 后修改的部分,只能回收上次 GC 后分配的对象

2、当进程状态变为后台、缓存 时,ART 将执行堆压缩

3、基于位图的内存分配程序,称为 RosAlloc(插槽运行分配器)
此新分配器具有分片锁,当分配规模较小时,可添加线程的本地缓冲区,因而性能优于 DlMalloc

4、ART CMS 垃圾回收优点:
1)与 Dalvik 相比,暂停次数从 2 次减少到 1 次
Dalvik 的第一次暂停主要是为了进行根标记,而在 ART 中进行并发标记

2)相对于 Dalvik,ART GC 改进的最后一个方面是 粘性 CMS 回收器增加了 GC 吞吐量

不同于普通的分代 GC,粘性 CMS 不移动。
系统会将年轻对象保存在一个分配堆栈(基本上是 java.lang.Object 数组)中,而非为其设置一个专属区域。
这样可以避免移动所需的对象以维持低暂停次数,但缺点是容易在堆栈中加入大量复杂对象图像而使堆栈变长。

3)ART GC 引入了 移动垃圾回收器
通过堆压缩来减少后台应用使用的内存

触发堆压缩的事件是 ActivityManager 进程状态的改变
应用转到后台运行时,它会通知 ART,此时 ART 会进行一些操作(例如,压缩、监视器压缩),从而导致应用线程长时间暂停。
两个移动 GC:同构空间压缩、半空间压缩

半空间压缩:将对象在两个紧密排列的碰撞指针空间之间进行移动
这种移动 GC 适用于小内存设备,因为它可以比同构空间压缩稍微多节省一点内存。
节省出的空间主要来自紧密排列的对象,节省了使用 RosAlloc/DlMalloc 内存分配器占用的开销

由于 CMS 仍在前台使用,因此当应用在前台使用时,半空间还要再进行一次转换,可能引起较长时间的暂停

同构空间压缩:将对象从一个 RosAlloc 空间复制到另一个 RosAlloc 空间来实现
通过减少堆碎片来减少内存使用量。
非低内存设备的默认压缩模式
相比半空间压缩,同构空间压缩的主要优势在于,应用从后台切换到前台时无需进行堆转换

总结:
1、ART 前台应用,使用 CMS 并发标记清除算法 GC,
只需要一次暂停,不移动分代,仅扫描堆中上次 GC 后修改的部分,只能回收上次 GC 后分配的对象

2、ART 后台应用,低内存设备,使用 半空间压缩 GC,
通过指针碰撞分配内存,不需要内存分配器,从而节省内存。
从后台切换到前台时,要进行堆转换,可能导致卡顿
(前台CMS垃圾回收,不能从碰撞指针空间中进行收集)

3、ART 后台应用,非低内存设备,使用 同构空间压缩 GC,
将对象从一个 RosAlloc空间复制到另一个 RosAlloc 空间,堆碎片少,节省内存使用。
(碎片内存不够大时无法用于存打对象,需要用大块碎片来分配)
从后台切换到前台时,不需要进行堆转换

你可能感兴趣的:(Android基础知识体系)