【转】Dalvik VM(转载整理)
转一篇转得好的,转自 Dalvik VM(转载整理)
Dalvik虚拟机是Google的用于移动设备的Android平台的一个主要部分。虚拟机可运行Java平台应用程序,这些应用程序被转换成紧凑的Dalvik可执行格式(.dex),该格式适合内存和处理器速度受限的系统。
Dalvik虚拟机的作者是丹伯恩斯坦(Dan Bornstein)。
与大多数虚拟机和真正的Java虚拟机不同,前者是栈机(stack machine),而Dalvik VM是基于寄存器的架构(register-based architecture)。就像CISC与RISC的争论,这两种方式的相对优点是一个不断争论的话题,且有时技术界限会变得模糊不清。此外,两种方法的相对优势取决于所选择的解释/编译策略。
一个名为dx的工具,它用于转换Java的.class文件到.dex格式。多个类文件可包含到单个的.dex文件中。重复的、可用于多个类的字符串和其它常量在转换到.dex格式时输出到保留空间。Java字节码还可转换成可选择的、Delvik VM使用的指令集。一个未压缩的.dex文件在文件大小方面往往比从同样的.class文件压缩成的.jar文件更小。
为满足低内存要求而不断优化, Dalvik虚拟机有一些独特的、有别于其它标准虚拟机的特征:
(1) 虚拟机很小,使用的空间也小;
(2) Dalvik没有JIT编译器;(Android 2.2 开始支持JIT)
(3) 常量池已被修改为只使用32位的索引,以简化解释器;
(4) 它使用自己的字节码,而非Java字节码。(It is not a JVM as you might expect.)
另外一篇终结:
(1) Dalvik VM和JVM 的第一个区别是 Dalvik VM是基于寄存器的架构(reg based),而JVM是栈机(stack based)。reg based VM的好处是可以做到更好的提前优化(ahead-of-time optimization)。 另外reg based的VM执行起来更快,但是代价是更大的代码长度。(预加载导致启动慢)
(2) 另外一个区别是Dalvik可以允许多个instance 运行,也就是说每一个Android 的App是独立跑在一个VM中.这样做的好处是一个App crash只会影响到自身的VM,不会影响到其他。 Dalvik的设计是每一个Dalvik的VM都是Linux下面的一个进程。那么这就需要高效的IPC。另外每一个VM是单独运行的好处还有可以动态active/deactive自己的VM而不会影响到其他VM
(3) 接下来就是关于版权之类争论。(可以参看下面文章)
既然reg based VM有那么多好处,为什么之前设计JAVA的人没有采用reg based而是采用stack based的呢? 原来stack based的VM也有其优点,就是它不对host平台的reg数量做假设,有利于移植到不同的平台。而Dalvik则不关心这些,因为它本来就是为ARM这样的多reg平台设计的。另外Dalvik被移植到x86也说明,即使是x86这种reg很少的平台,reg based的VM也是没有问题的。
注:这两种VM应该还有其他的优缺点,但是对应用开发人员或非相关内核开发人员而言没必要有深入的研究。
Dalvik VM官方网站:http://www.dalvikvm.com/
Dalvik VM wiki网站:http://en.wikipedia.org/wiki/Dalvik_(software) (网址有问题,需要拷贝整个URL打开)
《Android的虚拟机Dalvik引来论战不断》 http://www.oschina.net/bbs/thread/2547
参见: