Dalvik[Google公司设计的虚拟机]-头条百科-明日头条
Dalvik是Google公司自己设计用于Android平台的虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android联通设备平台的核心组成部份之一。它可以支持已转换为.dex(即DalvikExecutable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适宜显存和处理器速率有限的系统。Dalvik经过优化,容许在有限的显存中同时运行多个虚拟机的实例,而且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以避免在虚拟机崩溃的时侯所有程序都被关掉。
发展
Dalvik的诞生也引起人们开始担忧Java平台的第一次大规模的分道扬镳其实早已是进行时了——有人早已把Dalvik和谷歌的JVM以及Sun对谷歌的诉讼联系上去,等着看Google头上是否也会发生类似事情;另外一些人则强调,Google并没有声称Dalvik是一个Java实现,而谷歌却是这样做的。Sun也对可能带来的阵营分裂抒发了担忧情绪,并提出和Google合作来保证Dalvik和JVM之间的兼容性——Google对此的解释是,Dalvik是对解决目前JavaME平台上分裂的一次尝试node.js安装linux,也是为了提供一个拥有较少限制许可证的平台。甚至还有人怀疑这是否是Sun和Google两大阵营对Java之未来的一次大规模交锋。IanSkerret觉得,Dalvik的诞生是对Sun尝试控制和保护来自JavaME收入来源的一次反应,以及对完善OpenJDK统辖理事会迟迟遭拒的回答。
这也造成DaliborTopic怀疑Google是否要重履Sun走过的路:
其实,一个很有意思的问题是,为何没人有勇气拿Google关于OpenJDK的问题反过来问Google呢?
尽管Android堪称开源,但它仍是专有产品。Android做过兼容性保证,是在秘密大会室中订立和保管的。
Android不具备任何整治模型,也没有证据强调将来会出现整治模型。Android没有规范,但是它的许可证严禁任何取代实现的开发,由于这并非Google在SDK许可证中授权许可的使用权。Android完全在Google的掌控之下,一旦有竞争性应用在财政上损害了Google的利益,Google是保有一刀扼杀这种应用的权力的。从设计伊始,Android就遭到限制,只能在Google的财务利益容许的条件内开放。专有的Java也是旧罐装新酒而已。这就好象你们在见证JCP的重生一样,人们排着队把开源社区的“街头信誉”在一个单一的、专有的实现的基础上卖给另外一个封闭的厂商垄断集团。只不过此次的大头改姓Google,而不是Sun了。(不过你们在狂吼着开源的时侯,却好像全都忘掉了开发这一系列软件本身须要巨大的投入,因而利益在前,这显然也无可厚非。)
StefanoMazzocchi发布了一篇剖析报告,深切入里地阐述了围绕JavaME和Dalvik的许可证问题,他得出推论说,Dalvik的市场定位良好,足以给联通电话市场带来冲击。虽然Google始终都很当心防止引发诉讼的几个关键点,但Mazzocchi相信Sun还是会起草知识产权案的起诉书(IBM也有可能)。他还强调,因为在JCP之外操作,Google可以十分快地对Android进行修改,并且可以避免Sun对任何JCP更动的否决权——这样她们也可以为例如USB和蓝牙这样的组件加入插口,而这种组件在基础JavaME实现中是不可用的。
最后,通过在Apache许可证下授权许可Dalvik的源码,联通电话营运商更有可能采用Dalvik,由于营运商可以在不耗费许可费用的情况下使用和更改它。
据悉,Java也早已不再是人们在Dalvik上开发所选择的惟一语言了——已经有人在Dalvik上运行Scala取得了成功,但是Hecl也早已被成功移植了。另外更有人对运行Groovy做了一次尝试,不过目前为止还不如何成功。Mono项目的创始人MigueldeIcaza也对在Dalvik源码公开以后将Mono整合到Dalvik上表示了兴趣,
但是也早已有人推测怎样用多种方法来实现整合了,包括与随AndroidSDK提供的Java到Dalvik重编译器类似的CIL(CommonIntermediateLanguage,通用中间语言)到Dalvik重编译器。
(dx是一套工具,可以将Java.class转换成.dex格式.一个dex档一般会有多个.class。因为dex有时必须进行最佳化,会使档案大小降低1-4倍,以ODEX结尾。)
Dalvik和标准Java虚拟机(JVM)首要差异
Dalvik基于寄存器,而JVM基于栈。
基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时侯,耗费的时间更短。(Alsoofregister-basedVMsallowfasterexecutiontimesattheexpenseofprogramswhicharelargeraftercompilation.)
Dalvik和Java运行环境的区别
1:Dalvik主要是完成对象生命周期管理,堆栈管理手机平台虚拟机linux,线程管理手机平台虚拟机linux,安全和异常管理,以及垃圾回收等等重要功能。
2:Dalvik负责进程隔离和线程管理,每一个Android应用在底层还会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
3:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex
4:dex文件格式可以降低整体文件规格,提升I/o操作的类查找速率。
5:odex是为了在运行过程中进一步增强性能linux 下载工具,对dex文件的进一步优化。
6:所有的Android应用的线程都对应一个Linux线程,虚拟机因此可以更多的依赖操作系统的线程调度和管理机制
7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时侯才会形成,它会完成虚拟机的初始化,库的加载,预制泛型和初始化的操作。若果系统须要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块显存区域。
8:Dalvik是由DanBornstein编撰的,名子来始于他的先祖以前居住过名叫Dalvík的小渔港,村庄坐落澳大利亚Eyjafjörður。
前景
很长时间以来,Dalvik虚拟机仍然被用户质疑为拖慢安卓系统运行速率不如IOS的症结。
2014年6月25日,AndroidL将即将现身于举行的微软I/O会议,AndroidL改动幅度较大,微软将直接删掉Dalvik,取代它的是传言已久的ART。
因为ART的出现,使Dalvik在安卓系统应用方面注定成为历史。
构架
不同于其他堆栈结构的Java虚拟机,dalvik采用的是基于寄存器的构架。
dx工具将部份(但不是全部)Java的.class文件转换成.dex格式。多个类被包含在一个.dex文件中。为了节约空间,各个类文件中重复的字符串和其他常数只在.dex输出中储存一次。Java字节码被转换成Dalvik虚拟机所使用的取代指令集。一个未压缩的.dex文件一般比来自相同.class文件的已压缩.jar文档小。
当被安装到联通设备时,Dalvik可执行文件可能会被更改。为了进一步优化,虚拟机可能会调整文件内部分数据的端序、内联一些函数和简单的结构体、并漏电掉一些毋须要的操作等。
自Android2.2开始,Dalvik支持JIT(just-in-time,即时编译技术)。
优化后的Dalvik较其他标准虚拟机存在一些不同特点
·占用更少空间
·为简化翻译,常量池只使用32位索引
·标准Java字节码推行8位堆栈指令。Dalvik使用16位指令集直接作用于局部变量。局部变量一般来自4位的“虚拟寄存器”区。这样减轻了Dalvik的指令计数,增强了翻译速率。
当Android启动时,DalvikVM监视所有的程序(APK),但是创建依存关系树,为每位程序优化代码并储存在Dalvik缓存中。Dalvik第一次加载后会生成Cache文件,以提供上次快速加载,所以第一次会很慢。
Dalvik类库采用预先算好的Goto地址,每位指令对显存的访问都在64字节边界上对齐。这样可以节约一个指令后进行查表的时间。为了加强功能,Dalvik还提供了快速翻译器(FastInterpreter)。
性能
基于堆栈的机器与基于寄存器的机器谁更有优势仍然是个争辩不休的话题。
通常来说,基于堆栈的机器必须使用指令能够从堆栈上的加载和操作数据,因而,相对基于寄存器的机器,它们须要更多的指令能够实现相同的性能。并且基于寄存器机器上的指令必须经过编码,因而,它们的指令常常更大。这些差别主要是VM机对的操作码调度导致的,它们常常比其他的诱因高昂,例如说及时汇编。
但是,2010年,在Oracle公司(Java技术的拥有者)嵌入式设备上的标准非图形化性能测试表明,Android2.2(最初的版本包括一个即时编译器)比JavaSE嵌入式设备(三者都基于JavaSE6)慢2-3倍。
泛型
Dalvik虚拟机既不支持JavaSE也不支持JavaME泛型(如:Java类,AWT和Swing都不支持)。相反,它使用自己完善的泛型(ApacheHarmonyJava的一个子集)。
其他
许可与专利
Dalvik是基于ApacheLicense2.0发布的。Google说Dalvik是一个清洁室(cleanroom)的实现,而不是一个在标准Java运行环境的改进,这意味着它不承继标准版本的或开源的Java运行环境的版权许可限制。关于这一点,Oracle和一些专家还在讨论中。
已于2009年4月竞购Sun(SunMicrosystems)的Oracle获得了Java的专利,在2010年8月12日控告Google侵害其版权和专利。Oracle申明,Google在开发Android当中直接而且多次侵害关于Java的知识产权。在2012十月,陪审团觉得Google没有侵害Oracle的专利,法院认定Google所使用的JavaAPIs没有版权。双方同意零港元法定赔付的9行复制代码(9linesofcopiedcode)。
非Android平台
2011年,MyriadGroup软件公司公布了不仅android以外一个新的Dalvik虚拟机平台端口“AlienDalvik”。