类加载机制

类加载机制

类加载机制是学习JVM很重要的一块知识,能够详细的了解类加载机制以及流程。无论是对面试还是以后工作的问题定位,都有很大的帮助。

类加载器

JVM类加载器有启动类加载器,扩展类加载器,系统类加载器以及自定义类加载器。各个类加载器从上到下拥有继承关系。
启动类加载器是有C++实现的,

用于加载${JAVA_HOME}/lib目录下的,或者-Xbootclasspath参数指定的路径中的,
并且是虚拟机识别的(仅按照文件名识别,如rt.jar,
名称不符合的类库即使放在lib目录中也不会被加载)类库。

扩展类加载器是有java语言实现,用于加载${JAVA_HOME}/lib/ext/下的文件,或者被java.ext.dirs系统变量指定的路径中的所有类库,程序员可以直接使用。

系统类加载器是我们最常使用的类加载器,主要用于加载class_path下的类。

自定义类加载器最大的用处就是热替换,如jsp文件,在tomcat下,每个jsp文件拥有一个自定义类加载,当我们替换jsp文件时,虚拟机会连同类加载器一同抛弃重新生存,可以实现热部署。

类加载机制

通常我们使用的类加载机制都是使用双亲委派机制。因为各个类加载器拥有继承关系,所以当虚拟机需要加载一个类的时候,当前的类加载器并不会直接加载这个类,而是逐层向上请求,让父加载器去加载,上层的加载器无法加载该类时,再逐层向下,尝试去加载该类。这就是双亲委派机制。使用双亲委派机制的好处是防止类的重复加载,虚拟机根据类的全限定类名和加载器才能唯一确定一个类。这样,使用双亲委派机制才不会出现一个类已经被启动类加载器加载过,又被系统类加载器重新加载的情况。

我们说通常使用的类加载机制是双亲委派机制,但也有例外的时候,如OSGI,就不是完全使用双亲委派机制,而是使用更为复杂的网状结构。

类加载过程

类加载流程主要分为以下几步:
加载–连接(验证–准备–解析)–初始化–使用–卸载
虚拟机承诺各个步骤会按顺序启动,却不保证各个顺序会按顺序执行。也就是说解析一定会在初始化前启动,但可能解析未完成的时候,初始化已经启动。
下边分别介绍上述每一步的工作
加载主要是将文件系统、网上的class文件加载到虚拟机中,以备后续使用。该阶段虚拟机需要完成以下几件事情:

 1. 通过类的全限定名找到该类的二进制字节流
 2. 将类文件转化为方法区的运行时数据
 3. 生成一个代表该类的Class对象

验证是验证当前载入虚拟机的class文件是否符合虚拟机的要求,如验证文件版本等参数。防止有对系统有危害的类载入。主要验证的有:

 1. 文件格式验证
 2. 元数据验证
 3. 字节码验证
 4. 符号引用验证

准备准备阶段正式为类变量分配内存并设置类变量初始值。

解析 解析阶段时虚拟机将常量池中的符号引用替换为直接引用的过程。其中常见的错误IllegalAccessError(访问权限不足)、NoSuchMethodError(方法解析、没有该方法)、NoSuchFieldError(字段解析、没有该字段)就是在这个阶段抛出的。

初始化是给静态变量进一步赋值,如执行static代码块等。这也是为什么静态代码块只执行一次,因为一个类只初始化一次,而普通代码块每次新创建一个对象,就会执行一次。且静态代码块先于普通代码块执行。另外父类的初始化一定先于子类的初始化,且虚拟机保证初始化代码执行的线程安全。

类加载的时机

在以下的几种情况下如果类还未加载,则会去加载:

  1. 遇到new、gestatic、putstatic或invokestatic的时候,即创建一个新的对象或者使用类静态属性时,使用常量不会触发类加载,因为常量在编译器生成,已经放入到了常量池中。
  2. 子类加载会先触发父类加载,这里的类不包括接口,接口加载的时候不会触发父接口去加载。只有真正使用到父接口的时候,才会去加载父接口。
  3. 使用java反射机制对类进行调用的时候
  4. 虚拟机启动的时候,用户指定的包含main方法的类需要先加载
5. 当使用JDK 1.7的动态语言支持时,
如果一个MethodHandle实例最后的解析结果
REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,
并且这个句柄所对应的类还未被加载的时候

文中代码块内的文字摘自 《深入理解Java虚拟机》周志明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值