安卓目前有两种虚拟机,Dalvik跟Art,Art是M之后才出的,Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格 式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。
从 Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层(上层是运行时核心库)。
主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。当然这些大家都知道,下面来看看几个区别。
Dalvik跟 JVM区别
运行内容
dvm运行的是dalvik字节码,jvm运行java字节码。
Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序。而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX可执行文件中。Dalvik虚拟机通过解释DEX文件来执行这些字节码。
也就是说,在生成字节码之后,两个虚拟机就各自有自己的想法了,jvm直接对class文件操作了,dvm其实简单来看也差不多,经过DX工具将class文件转换成Dalvik虚拟机可以执行的dex文件,生成的是dalvik字节码。
类结构
dx工具对Java类文件重新排列,消除在类文件中出现的所有冗余信息,避免虚拟机 在初始化时出现反复的文件加载与解析过程。
一般情况下,Java类文件中包含多个不同的方法签名,如果其他的类文件引用该类文件中的方法,方法签名也会被复制到其类文件中,也就是说,多个不同的类会同时包含相同的方法签名,同样地,大量的字符串常量在多个类文件中也被重复使用。
这些冗余信息会直接增加文件的体积,同时也会严重影响虚拟机解析文件的效率。消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享同一个常量池。由于dx工具对常量池的压缩,使 得相同的字符串,常量在DEX文件中只出现一次,从而减小了文件的体积。
架构
Java虚拟机基于栈架构,程序在运行时虚拟机需要频繁的从栈上读取或写入数据, 这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间,对于像手机 设备资源有限的设备来说,这是相当大的一笔开销。Dalvik虚拟机基于寄存器架 构。数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。
跟ART的区别
DVM依靠JIT运行时解析,ART在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)编译,在移除解释代码这一过程 后,应用程序执行将更有效率,启动更快。
垃圾回收机制
首先介绍下dalvik的GC的过程.主要有有四个过程:
- 当gc被触发时候,其会去查找所有活动的对象,这个时候整个程序与虚拟机内部 的所有线程就会挂起,这样目的是在较少的堆栈里找到所引用的对象.需要注意 的是这个回收动作和应用程序非并发。
- gc对符合条件的对象进行标记
- gc对标记的对象进行回收
- 恢复所有线程的执行现场继续运行
dalvik这么做的好处是,当pause了之后,GC势必是相当快速的.但是如果出现GC频 繁并且内存吃紧势必会导致UI卡顿,掉帧.操作不流畅等。
后来ART改善了这种GC方式 , 主要的改善点在将其非并发过程改变成了部分并发. 还有就是对内存的重新分配管理。
当ART GC发生时:
- GC将会锁住Java堆,扫描并进行标记
- 标记完毕释放掉Java堆的锁,并且挂起所有线程 3. GC对标记的对象进行回收
- 恢复所有线程的执行现场继续运行
- 重复2-4直到结束
Dalvik内存管理特点是:内存碎片化严重,当然这也是标记清除算法带来的弊端,
ART的解决:在ART中,在单独的内存空间存放large Object。同时ART将不连续的物理内存块进行对齐.对齐了后内存碎片化就得到了很好的解 决。
网友评论