Android系统中存在Dalvik虚拟机(DVM),JVM是Java虚拟机,两者都是虚拟机,它们有什么区别?Dalvik虚拟机是谷歌等厂商开发的Android移动设备平台的核心组件之一。它可以支持运行已转换为.dex(DalvikExecutable)格式的Java应用程序。.dex格式是专门为Dalvik设计的压缩格式,适用于内存和处理器速度有限的系统。(dx是一套可以将Java.class转成.dex格式的工具,一个dex文件通常有多个.classes,因为dex有时必须要优化,所以文件大小会增加1-4倍,ODEX结束。)1.Dalvik与标准Java虚拟机(JVM)的主要区别Dalvik是基于寄存器的,而JVM是基于栈的。基于寄存器的虚拟机在编译大型程序时花费的时间要少得多。在JVM字节码中,局部变量会被放入局部变量表中,然后压入栈中供opcode操作。当然,JVM也可以只使用栈而不显式地将局部变量存储到变量表中。在Dalvik字节码中,局部变量被分配给65536个可用寄存器中的任意一个,Dalvik指令直接对这些寄存器进行操作,而不是访问堆栈中的元素。2.Dalvik和Java字节码的区别VM字节码由.class文件组成,每个文件都有一个类。JVM在运行时为每个类加载字节码。相比之下,一个Dalvik程序只包含一个.dex文件,其中包含程序中的所有类。Java编译器生成JVM字节码后,Dalvik的dx编译器删除.class文件,重新编译成Dalvik字节码,写入.dex文件。这个过程包括对程序基本元素(常量池、类定义、数据段)的翻译、重构和解释。常量池描述了所有常量,包括引用、方法名、数字常量等。类定义包括访问标志和类名等基本信息。数据段包含VM执行的各种函数代码和类、函数的信息(如DVM需要的寄存器个数、局部变量表、操作数栈大小)、实例变量等。3.Dalvik和JavaSDK的SDK不同4.Dalvik和Java运行环境的区别Dalvik经过优化,允许多个虚拟机实例在有限的内存中同时运行,每个Dalvik应用程序作为一个独立的Linux进程执行。单独的进程防止所有程序在虚拟机崩溃时关闭。Dalvik虚拟机在Android2.2之后采用了JIT(Just-In-Time)技术,与传统JVM的JIT并不完全相同。Dalvik虚拟机有自己的字节码,而不是使用Java字节码。其他不同点1、Dalvik主要完成对象生命周期管理、栈管理、线程管理、安全和异常管理、垃圾回收等重要功能。2、Dalvik负责进程隔离和线程管理。每个Android应用都会在底层对应一个独立的Dalvik虚拟机实例,其代码可以在虚拟机的解释下执行。3、与运行java字节码的Java虚拟机不同,Dalvik虚拟机运行其专有的文件格式dex。4、dex文件格式可以减小整体文件大小,提高I/O操作类查找速度。5.odex是为了进一步提高运行时的性能,进一步优化dex文件。6、所有的Android应用线程都对应一个Linux线程,所以虚拟机可以更多的依赖操作系统的线程调度和管理机制。7、有一个特殊的虚拟机进程Zygote,它是虚拟机实例的孵化器。它会在系统启动时生成,完成虚拟机初始化、库加载、预制类库和初始化操作。如果系统需要一个新的虚拟机实例,它会快速复制自己并尽快提供给系统。对于一些只读的系统库,所有的虚拟机实例都与Zygote共享一个内存区域。【本文为专栏作者“朱国立”原创稿件,转载请通过作者微信公众号“开发者圆桌”联系授权】点此查看本作者更多好文
