Dalvik虚拟机(DalvikVirtual Machine)
DVM 是 Google 专门为 Android 平台开发的虚拟机,它运行在 Android 运行时库中
DVM与JVM的区别
DVM不是一个JVM,主要原因时 DVM 并没有遵循 JVM 规范来实现的。DVM 与 JVM 主要有以下区别:
- 基于的架构不同
JVM基于栈,意味着需要去栈中读写数据,所需的指令会更多,这样会导致速度变慢,对于性能有限的移动设备,显然不是很适合的
DVM基于寄存器,没有基于栈的虚拟机在复制数据时而使用大量的出入栈的指令,同时指令更紧凑、更简洁;但由于显式指定了操作数,所以基于寄存器的指令会比基于栈的指令更大 - 执行的字节码不同
Java SE中,Java类被编译成了一个或多个 .class 文件,并被打包成 jar 文件,而后 JVM 会通过相应的 .class 文件和 jar 文件获取相应的字节码,执行顺序为: .java 文件 -> .class 文件 -> .jar文件
DVM 会用 dx 工具将所有的 .class 文件转换为一个 .dex 文件,然后 DVM 会从该 .dex 文件读取指令和数据 - DVM 允许在有限的内存中同时运行多个进程
在 Android 中的每一个应用都运行在一个 DVM 实例中,每一个 DVM 实例都运行在一个独立的进程空间中,独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭 - DVM 由 Zygote 创建和初始化
Zygote 是一个 DVM进程,同时也用来创建和初始化 DVM 实例 - DVM 有共享机制
不同应用之间在运行时可以共享相同的类,