Android虚拟机与类加载机制

JVM与Dalvik

JVM是基于栈的虚拟机

每一个运行时的线程,都有一个独立的栈,线程中的每一个方法,都对应一个栈帧

栈中包括程序计数器,栈帧

每个栈帧都包括:局部变量表,操作数栈,动态链接,返回地址

字节码指令:
每一个操作,程序计数器都会+1
ICONST 将数据压入操作数栈,栈顶
ISTORE 将栈顶数据赋值给局部变量表

ART、Dalvik是基于寄存器的虚拟机

基于寄存器的虚拟机没有操作数栈,但是有很多虚拟寄存器,作用和操作数栈相同,本质上是一个数组

Dalvik执行的是dex字节码,解释执行,2.2版本开始JIT(Just In Time)编译。

Dalvik下应用在安装的过程,会执行一次优化,将dex字节码优化生成odex文件,5.0之后而ART下将应用的dex字节码翻译成本地机器码(使用了预先编译机制(AOT,Ahead Of Time))。ART使用设备自带的工具dex2oat,在安装时翻译成本地机器码。

7.0之后是混编
安装的时候不进行AOT编译,运行过程中解释执行,对经常执行的方法进行JIT,经过JIT的方法会记录到Profile配置文件中。
当设备闲置时守护进程回运行,根据Profile文件对常用代码进行AOT编译,下次运行时直接使用。

ClassLoader

双亲委托机制
  1. 当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。
    每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。

  2. 当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader.

  3. 当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException    {  
	// First, check if the class has already been loaded  
	Class c = findLoadedClass(name);
	//检查class是否已经被加载过了  
	if (c == null) {     
		try {      
			if (parent != null) {         
				//如果没有被加载,且指定了父类加载器,则委托父加载器加载。   
	 			c = parent.loadClass(name, false);  
 			 } else {        
 			 	//如果没有父类加载器,则委托bootstrap加载器加载  
 				 c = findBootstrapClass0(name);    					
 			} 
     	} catch (ClassNotFoundException e) {         
	 		// If still not found, then invoke findClass in order          
			// to find the class. 
			//如果父类加载没有加载到,则通过自己的findClass来加载。        
 			c = findClass(name);     
 		} 
	 } 
 	if (resolve) {     
 		resolveClass(c); 
	 }
	return c;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值