Dalvik之小我见
Dalvik是Android平台的Java虚拟机,但他又与JVM不同。Dalvik是专门为Android这种移动设备而存在的。每个APP都会运行在一个Dalvik的实例上,而一个Dalvik实例则是一个Linux下的进程。
Dalvik会将Android程序编译成.dex文件,他于.class文件不同,它是由多个.class文件组成的,这样就减少了编译后代码的体积,就像压缩文件一样,压缩的文件越多,压缩率就越高。
Java代码中的常量占了很大一部分,JVM的constant pool即常量池为Java的class节约了很多的空间,每一个class使用一个constant pool,而.dex中的多个class可以共用一个constant pool,这样更节约了空间,但是这样也产生了一个问题,就是垃圾回收的困难。Dalvik还对constant pool中的常量进行了分区,更提高了效率。
Dalvik编译产生的.dex中的汇编指令比JVM的.class文件要少,但每条指令包含了更多的内容,使得指令集的密度提高。Dalvik的指令的执行时间比JVM的指令执行时间平均减少了32.3%。
JVM中每个class都会导入自己需要的library,而Android中的许多核心库是被APP共享的,Zygote使代码在Dalvik虚拟机中共享。
提到Dalvik即不得不提到Zygote,Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供系统。