七. 虚拟机类加载机制

2017-10-10  本文已影响0人  柒黍

7.1 概述

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言里,类型的加载、连接、初始化过程都是在程序运行期间完成的.

7.2 类加载的时机

一个类的生命周期概括可分为类的加载、连接、初始化、使用、卸载,其中连接又可分为3步,验证、准备、解析.

虚拟机规范严格规定了5中情况必须立即对类进行“初始化”

不会发生初始话的情况:

7.3 类的加载过程

其中比较特殊的是数组类,数组类本身不是通过ClassLoader创建,它是又Java虚拟机直接创建

7.4 类的加载

7.4.1 类与类的加载器

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类命名空间

7.4.2 双亲委派模型

1. Bootstrap ClassLoader(是启动类加载器),由C++实现,是虚拟机的一部分。负责将存放在 <JAVA_HOME>\lib 目录中,或者被 -Xbootclasspath参数所指定的路径中的,并且是虚拟机识别(仅按照文件识别,如rt.jar 名字不符的类库即使放在lib目录中也不会被加载)的类库加载到虚拟机中

2. Extension ClassLoader (扩展类加载器),由sum.misc.Launcher$ExtClassLoader实现,它负责加载 <JAVA_HOME>\lib\ext 目录中的类,或被java.ext.dirs系统变量所指定路径中的类,开发者可直接使用。

3. Application ClassLoader (应用程序类加载器),由sum.misc.Launcher$AppClassLoader实现, 一般称为系统类加载器,它负责加载用户路径 ClassPath 上所指定的类库,开发者可直接使用。

这种层次关系称为类加载器的双亲委派模型(Parents Delegation Model)

工作过程:
如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载此类, 而是把这个请求委派给父类加载器去完成,所有的加载请求最终都会传到顶层BootstrapClassLoader去尝试加载,只有父类无法加载时,子类才会尝试加载。

为什么要这样设计?
Java类随着它的类加载器一起具备了优先级的层次关系.

源码如下:先检查是否已经被加载过,若没有加载则调用父加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父加载器加载失败,抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。

上一篇下一篇

猜你喜欢

热点阅读