上QQ阅读APP看书,第一时间看更新
3.2 Dalvik虚拟机的主要特征
在Dalvik虚拟机中,一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息;而DEX文件格式会把所有的CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸和I/O操作,也提高了类的查找速度。在每个类文件中的常量池,都是在DEX文件中由一个常量池负责管理。
每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制、内存分配和管理、Mutex等都是依赖底层操作系统实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多地依赖操作系统的线程调度和管理机制。
不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度地保护应用的安全和独立运行。
Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个Android应用程序,Zygote就会FORK(孕育)出一个子进程来执行该应用程序。这样做的好处如下所示:
Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化、库的加载、预置类库的加载和初始化等操作。
当系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速地提供一个系统。
对于一些只读性的系统库来说,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。
相对于基于堆栈的虚拟机实现,基于寄存器的虚拟机实现虽然在硬件通用性上要差一些,但是它在代码的执行效率上却更胜一筹。在基于寄存器的虚拟机里,可以更为有效地减少冗余指令的分发和减少内存的读写访问。