浅析JVM类装载器

类装载器就是寻找类的字节码文件并构造出类在jvm内部表示对象的组件。在java中,类装载器把一个类装入jvm中,要经以下步骤:
1.装载:查找和导入.class文件
2.链接:执行校验,准备和解析步骤,其中解析步骤是可以选择的。
1.校验:检查载入.class文件的正确性。
2.准备:给类的静态变量分配存储空间。
3.解析:将符号引用转换成直接引用。
3.初始化:对类的静态变量,静态代码块执行初始化工作。

类装载工作由ClassLoader(类装载器)和其子类负责。ClassLoader是一个重要的java运行时系统组件, 它负责在运行时查找和装入.class字节码文件。jvm在运行时会产生3个装载器,分别为:ClassLoader:根装载器,ExtClassLoader(扩展装载器),AppClassLoader(应用类装载器)。
注:根装载器不是ClassLoader的子类,它使用C++语言编写,所以在java中是看不到它的,它负责装载JRE的核心类库,如rt.jar等。而ExtClassLoader和AppClassLoader都ClassLoader的子类,其中ExtClassLoader负责装载JRE扩展目录ext中的jar类包,AppClassLoader负责装载Classpath路径下的类包。
通过java代码来查看类装载器:
例:
package com.java.test;


/**
 *类装载器
 *作者:罗祥
 *电话号码:1507088590
 *创建时间:2017年12月21日下午7:23:15
 */
public class ClassLoaderTest {


	public static void main(String[] args){
		
		/*
		 *根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。
		 *默认情况下,使用AppClassLoader装载器
		 * 
		 * */
		ClassLoader loader = Thread.currentThread().getContextClassLoader();
		System.out.println("create loader:"+loader);
		System.out.println("parent loader:"+loader.getParent());
		//根装载器在java中访问不到,所以返回null,因为根装载器是用c++写的。
		System.out.println("grandparent loader:"+loader.getParent().getParent());
		
		/*
		 * 结果:
		 * create loader:sun.misc.Launcher$AppClassLoader@2a788b76
		   parent loader:sun.misc.Launcher$ExtClassLoader@500c05c2
		   grandparent loader:null
		 * */
	}
}
jvm装载类是使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader装载一个类时,除非显式地使用另一个ClassLoader载入。“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值