1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念?
Dalvik虚拟机允许多个instance的存在。实际上android中的每一个app都是运行在自己VM实例之中(沙盒)。每一个VM实例在linux中又是一个单独的进程,所以可以认为是同一个概念。运行在自己的DVM进程之中,不同的app不会相互干扰,且不会因为一个DVM的崩溃导致所有的app进程都崩溃。
Dalvik虚拟机允许多个instance的存在。实际上android中的每一个app都是运行在自己VM实例之中(沙盒)。每一个VM实例在linux中又是一个单独的进程,所以可以认为是同一个概念。运行在自己的DVM进程之中,不同的app不会相互干扰,且不会因为一个DVM的崩溃导致所有的app进程都崩溃。
1.1 什么是Dalvik虚拟机?
java的运行需要JVM(后面有大量篇幅介绍),同样android中使用了java语言,也需要一个VM。针对手机处理器和内存等硬件资源不足而推出来的一款VM,为android运行提供环境。
2.与JVM的区别
2.1.基于架构的不同。JVM是基于栈的架构,而DVM是基于寄存器架构。
2.1.1 为什么JVM设计成基于栈架构, DVM是基于寄存器架构?
2.1.基于架构的不同。JVM是基于栈的架构,而DVM是基于寄存器架构。
2.1.1 为什么JVM设计成基于栈架构, DVM是基于寄存器架构?
优点: a.基于栈架构的指令集更容易生成(http://rednaxelafx.iteye.com/blog/492667);
b.节省资源。其零地址指令比其他指令更加紧凑
c.可移植性。考虑到JVM使用的场合大多是pc和服务器,这类机器的处理器中通用寄存器的数量不尽相同,如果使用基于寄存器其功能提升不多;而栈架构可以自由分配实际的寄存器,这样的可移植性比较高,也符合java的设计理念(一次编写,处处运行)。
DVM为什么基于寄存器:
优点:a.android手机制造商的处理器绝大部分都是基于寄存器架构的。
b.栈架构中有更多的指令分派和访问内存,这些比较耗时。所有相对来认为dvm的执行效率更高一些。
c.DVM就是为android运行而设计的,无需考虑其他平台的通用。
b.节省资源。其零地址指令比其他指令更加紧凑
c.可移植性。考虑到JVM使用的场合大多是pc和服务器,这类机器的处理器中通用寄存器的数量不尽相同,如果使用基于寄存器其功能提升不多;而栈架构可以自由分配实际的寄存器,这样的可移植性比较高,也符合java的设计理念(一次编写,处处运行)。
DVM为什么基于寄存器:
优点:a.android手机制造商的处理器绝大部分都是基于寄存器架构的。
b.栈架构中有更多的指令分派和访问内存,这些比较耗时。所有相对来认为dvm的执行效率更高一些。
c.DVM就是为android运行而设计的,无需考虑其他平台的通用。
2.2.jvm运行的是字节码文件,而dvm运行自己定义的dex文件格式
JVM编译过程 java->class->jar
DVM编译过程java->class->dex。此过程又DX工具将所有class文件编译成一个dex文件,并会将多个class文件进行重构,好处主要有:减少了整体文件的尺寸,因为不同class文件中有重复的常量;提高运行速度。所有的class文件都生成在同一个文件之中,查找速度变快。
JVM编译过程 java->class->jar
DVM编译过程java->class->dex。此过程又DX工具将所有class文件编译成一个dex文件,并会将多个class文件进行重构,好处主要有:减少了整体文件的尺寸,因为不同class文件中有重复的常量;提高运行速度。所有的class文件都生成在同一个文件之中,查找速度变快。
图从java文件生成dex文件过程
3.Dalvik设计规则
3.1每一个app都运行在自己的DVM实例中与应用隔离。
3.2启动一个app进程,一个DVM也就诞生了,该app下的代码在DVM实例下解释运行
3.3有几个app进程就有几个dvm实例。
3.4dvm对对象生命周期(组件生命周期理解)、堆栈、线程、异常以及垃圾回收进行管理。
3.5不支持j2se和j2me的api,也就不支持awt和swing(现在用的也非常少)
3.2启动一个app进程,一个DVM也就诞生了,该app下的代码在DVM实例下解释运行
3.3有几个app进程就有几个dvm实例。
3.4dvm对对象生命周期(组件生命周期理解)、堆栈、线程、异常以及垃圾回收进行管理。
3.5不支持j2se和j2me的api,也就不支持awt和swing(现在用的也非常少)
4.和ART的比较
在dalvik中,app每一次运行都要通过即时编译器转化成机器码,这要多了一个编译过程,会降低运行速度。
而ART则是在安装时,直接将字节码编译成本机机器码,实现了真正的本地应用,在以后的运行中不需要每次都翻译。这样速度更快,但是所占用的存储空间越大。(5.0新特性)