说明:笔记内容来源于《北京圣思园教育 - 张龙老师 - 深入理解JVM》视频课程。如有侵权,请联系删除。
1 类加载器的父亲委托机制
在父亲委托机制中,各个加载器按照父子关系形成了一种逻辑上的树形结构。
除了根类加载器之外,其余的类加载器都有且只有一个父加载器。
类加载器的父亲委托机制,是Oracle的HotSpot虚拟机默认自带的类加载器委托机制。
有些环境并不遵循类加载器的父亲委托机制,比如OSGi标准。
下图是类加载器父亲委托机制的示意图。
(1) 自底向上检查类是否已经被加载
(2) 自顶向下尝试加载类
2 类加载器的简述
(1) Bootstrap ClassLoader 启动类加载器
$JAVA_HOME中jre/lib/rt.jar里所有的class,
由C++实现,不是java.lang.ClassLoader的子类
(2) Extension ClassLoader 扩展类加载器
负责加载java平台中扩展功能的一些jar包,
包括$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目录下的jar包
(3) App ClassLoader 系统类加载器
负责加载classpath中指定的jar包及目录中的class
3 定义类加载器、初始类加载器
如果一个类加载器能成功加载Test类,那么这个类加载器被称为 定义类加载器。
所有能成功返回Class对象引用的类加载器(包括定义类加载器)都被称为 初始类加载器。
比如,系统类加载器 成功加载了Sample,则系统类加载器就称为 定义类加载器;
系统类加载器、loader1都能返回Sample对象的引用,所以系统类加载器、loader1就称为 初始类加载器。
4 实例演示
4.1 String的类加载器
获取String的类加载器,返回结果为null,说明String的类加载器为 启动类加载器。
4.2 自定义类的类加载器
获取自定义类C的类加载器,返回结果为"sun.misc.Launcher$AppClassLoader@546b97fd",
说明String的类加载器为 系统类加载器。