Android虚拟机Dalvik

加入全栈技术交流群(QQ群号:254842154)

JVM

我们先了解一下JVM,顾名思义,就是Java虚拟机(Java Virtual Machine)的意思,它是一个虚构出来的计算机。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

Dalvik

Dalvik与JVM的关系密切,可以从Android源码的readme中看出:

Much of the code under this directory originally came from the Apache Harmony project, and as such contains the standard Apache header comment. Some of the code was written originally for the Android project…

但:Dalvik VM ≠ JVM

Dalvik基于寄存器,而JVM基于stack,Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。 Dalvik的优势: 1、在编译时提前优化代码而不是等到运行时; 2、 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例; 3、常量池已被修改为只使用32位的索引,简化解释器。

专有的DEX文件格式,它是如何组织类的元数据的呢?一个应用中会定义很多类,普通的java程序编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息。

而dex字节码和标准Java的字节码(Class)在结构上的一个区别是dex字节码将多个文件整合成一个,这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。原来每个类文件中的常量池现在由DEX文件中一个常量池来管理。

Android应用程序与Dalvik的关系

一个Android应用程序对于一个Dalvik虚拟机,也即一个进程。

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。每个进程之间可以通信(IPC,Binder机制实现)。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。

不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。

Zygote

Zygote是受精卵的意思,Google取这个名字真是煞费苦心啊。

Zygote是虚拟机实例的孵化器。每当系统要求执行一个Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。

这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

Zygote属于应用层,驱动层,而非内核层。

标签: none

→ 如果你觉得作者的文章不错,一不小心帮到了你,欢迎打赏作者几包辣条的钱💰