摘要
本文旨在介绍JVM、DALVIK和ART的概念,比较了JVM和Dalvik、Dalvik和ART,并记录了自己对这三者的理解。
概念
JVM
JVM是Java Virtual Machine(Java虚拟机)的缩写,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它是Java语言实现平台无关性的的关键。
Dalvik
Dalvik是Google公司设计的用于Android平台的虚拟机。
Dalvik是在Android 2.2之后才加入JIT(Just In Time,即时编译)技术的,每次都要编译+运行,这就导致应用的启动时间加长,执行效率低。
ART
ART是Android Runtime的缩写,从字面上讲,ART就是Android运行时环境,它是Android L后提取的用来无缝替换Dalvik的一种方案。
ART采用的时AOT(Ahead Of Time,预编译)技术的,在安装的时候九江dex字节码转化成机器码,这就导致应用的安装时间加长,但启动时间缩短,执行效率高。
比较
JVM和Dalvik比较
都是虚拟机,来看看二者的区别:
JVM | Dalvik | |
---|---|---|
指令集基于什么 | 基于堆栈的 | 基于寄存器的(能更快的执行,但由于寄存器与设备有关,牺牲了部分平台无关性) |
编译何种文件 | .class文件 | 更小.dex文件(为什么,因为Android设备内存、CPU资源有限) |
还有一点,Android系统中存在一个特殊的Dalvik虚拟机进程——Zygote,它是Dalik虚拟机实例的孵化器,随着系统的启动而启动,并完成虚拟机的初始化、库加载等操作,并在Android 应用启动时通过fork本身快速创建与该应用对应的虚拟机实例。
二者的相同点:
- 二者都可以启动多个不同的实例,其中Android每个应用都会有一个与之对应的Dalvik虚拟机实例
- 都是基于Java实现的。
Dalvik和ART比较
Dalvik | ART | |
---|---|---|
编译方式 | JIT(Android 2.2以上) | AOT |
占用空间 | 运行时进行dex到机器码的转换,占用空间小 | 安装的时候就讲dex变成机器码,空间大(空间换时间) |
电池续航 | 要重复编译,续航性能不好 | 不需重复编译,续航性能好 |
其他
Dalvik其他特性
内存管理
Dalvik内存大体分以下三个部分:
- Java Object Heap:用来分配Java对象的,new关键字新建的对象内存分配。
- Bitmap Memory:用来处理图像的,
- 在HoneyComb之前,在Native Heap中分配,同样计入Java Object Heap
- 之后,直接在Java Object Heap中分配。
- Native Heap:在native code中使用malloc分配出来的内存,不收Java Object Heap大小限制,滥用会导致内存急剧减少
问:为什么处理图像容易OOM(OutOfMemory)
答:图像的内存在Native Heap中分配,而Native Heap中分配的内存不收Java Object Heap的限制
垃圾收集(GC)
- 在GingerBread(Android 2.2之前),有如下特点:
- Stop-the-world,GC线程执行时,其他线程都停止
- Full-heap-collection,一次收集完所有垃圾
- 收集垃圾造成的程序中止时间通常大于100ms
- 之后,有如下特点:
- Concurrent,大多情况下,GC线程与其他线程并发执行
- Partial Collection,一次回收一部分
- 收集垃圾造成的程序中止时间通常小于5ms
本文完,后面还会做更深入的补充。