Dalvik源码分析(一)虚拟机概述

空扰寡人 提交于 2019-12-22 11:44:25

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

 

主要功能:


Dalvik功能图

Dalvik的主要作用是将java SDK 编译的.class文件编译成.dex文件,然后加载需要的类进行解释执行。同时对进程及内存进行管理。

 

Dalvik VM做了大量的优化,包括如下方面:

(1)Dex文件镜像格式采用了内容压缩技术。将多个class中的内容统一归类存储,即将方法、属性、字符串、类型均抽取出来统一存放,这样可以使所有重复的内容仅出现一次,通过引用(id)来访问。这种技术比JVM中基于zip的压缩技术更高。虽然压缩后的大小差不多,但是内容压缩无需解压缩,因此可以有效减少程序的启动时间。

(2)用Zygote统一管理VM。Android中所有应用均对应了一个VM,但是这些VM和JVM的使用方式不同,这些VM共享了应用程序中的系统代码和数据,这就类似OS中的动态Lib管理那样,同样的内容仅被加载一次,而一旦系统数据需要被某个应用修改时,则采用Copy-On-Write技术保证最少的性能开销。 这种技术不会造成Windows中的“Dll Hell”问题,因为系统库均为Dalvik提供,不会存在版本问题。但是随着应用的发展,可能会逐步出现可重用的Lib,那个时候就会有Windows曾经面临的痛苦了。

(3)Register-based VM。这个和JVM这种Stack-based VM有较大的不同。后者基于堆栈执行程序,虽然每个指令字较短,但是指令执行时却通常需要加载数据到堆栈,这就带来了更多的内存访问和更多的指令。虽然由于指令字较短,最终的程序文件大小并不比基于寄存器的程序更大。而基于寄存器的VM通常指令字较长,但是操作数通常在寄存器中,这样就提高了执行的速度。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!