Android中的Dalvik和ART详解及区别分析
要想知道dalvik和art区别分析,首先我们要分别知道这两者是什么?
什么是dalvik?
dalvik是google公司自己设计用于android平台的虚拟机。
dalvik虚拟机是google等厂商合作开发的android移动设备平台的核心组成部分之一。
它可以支持已转换为 .dex格式的java应用程序的运行,.dex格式是专为dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。
dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个dalvik 应用作为一个独立的linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
很长时间以来,dalvik虚拟机一直被用户指责为拖慢安卓系统运行速度不如ios的根源。
2014年6月25日,android l 正式亮相于召开的谷歌i/o大会,android l 改动幅度较大,谷歌将直接删除dalvik,代替它的是传闻已久的art。
什么是art?
即android runtime
art 的机制与 dalvik 不同。在dalvik下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,jit)转换为机器码,这会拖慢应用的运行效率,而在art 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(aot,ahead-of-time)。这样的话,应用的启动(首次)和执行都会变得更加快速。
下面是区别分析
dalvik和jvm有啥关系?
主要区别:
dalvik是基于寄存器的,而jvm是基于栈的。
dalvik运行dex文件,而jvm运行java字节码
自android 2.2开始,dalvik支持jit(just-in-time,即时编译技术)。
优化后的dalvik较其他标准虚拟机存在一些不同特性:
1.占用更少空间
2.为简化翻译,常量池只使用32位索引
3.标准java字节码实行8位堆栈指令,dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的“虚拟寄存器”区。这样减少了dalvik的指令计数,提高了翻译速度。
当android启动时,dalvik vm 监视所有的程序(apk),并且创建依存关系树,为每个程序优化代码并存储在dalvik缓存中。dalvik第一次加载后会生成cache文件,以提供下次快速加载,所以第一次会很慢。
dalvik解释器采用预先算好的goto地址,每个指令对内存的访问都在64字节边界上对齐。这样可以节省一个指令后进行查表的时间。为了强化功能, dalvik还提供了快速翻译器(fast interpreter)。
一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。
dalvik虚拟机既不支持java se 也不支持java me类库(如:java类,awt和swing都不支持)。 相反,它使用自己建立的类库(apache harmony java的一个子集)。
art有什么优缺点呢?
优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。
缺点:
1.机器码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%(不过在应用包中,可执行的代码常常只是一部分。比如最新的 google+ apk 是 28.3 mb,但是代码只有 6.9 mb。)
2.应用的安装时间会变长。
tips:现在智能手机大部分都可以让用户选择使用dalvik还是art模式。当然默认还是使用dalvik模式。
用法:设置-辅助功能-开发者选项(开发人员工具)-选择运行环境(不同的手机设置的步骤可能不一样)。
dalvik和art的几点区别
dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小
art是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大
用个比喻来说就是,骑自行车
dalvik 是已经折叠起来的自行车,每次骑都要先组装自行车才能骑
art 是已经组装好的自行车,每次骑直接上车就能走人
上一篇: Android应用创建桌面快捷方式代码
推荐阅读
-
Android中的Dalvik和ART详解及区别分析
-
Android开发中setContentView和inflate的区别分析
-
Android中invalidate()和postInvalidate() 的区别及使用方法
-
Android中invalidate()和postInvalidate() 的区别及使用方法
-
详解Android应用中屏幕尺寸的获取及dp和px值的转换
-
详解Android应用中屏幕尺寸的获取及dp和px值的转换
-
Python中%r和%s的详解及区别
-
详解PHP中cookie和session的区别及cookie和session用法小结
-
Android Activity中onStart()和onResume()的区别分析
-
Mybatis的mapper文件中$和#的用法及区别详解