JVM 与 Dalvik
Android 应用程序运行在 Dalvik / ART 虚拟机上,每个应用程序都有一个单独的虚拟机实例。Dalvik 虚拟机也是一个 Java 虚拟机,只不过执行的是 dex (一个 dex 包含多个 class ) 文件,而不是 class (一个class 就是一个文件) 文件
JVM 是基于栈的虚拟机,dalvik 是基于寄存器的虚拟机。
基于栈的虚拟机
对于基于栈的虚拟器来说,每一个运行时的线程,都有一个独立的栈,每一次方法调用,都会产生一个栈帧。 栈帧中存在一个操作数栈,而基于栈的虚拟机就是通过操作数栈来进行操作。
基于寄存器的虚拟机
寄存器是 CPU 的组成部分。寄存器是有限存贮容量的告诉存贮部件,可以用来暂存指令、数据和位址。
基于寄存器的虚拟机中没有操作数栈,担忧很多虚拟寄存器,这些寄存器也存放在运行时栈中,本质上就是一个数组,在 Dalvim VM 中每个线程都有自己的 PC 和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。
ClassLoader
每个类都有自己的类加载器。
getClass().getClassLoader()
双亲委派机制
某个类加载器在加载类时,首先将加载任务委托给父类加载器,依次递推,如果父类加载器可以完成类加载任务,就成功返回,只有父类加载器无法完成此加载任务或者没有父类加载器时,自己才去加载。
- 避免重复加载
- 安全
区分类加载
loadClass
findClass
简单热修复
在类加载之前加载自己的 dex 文件来覆盖要修复的类。
网友评论