4.jvm入门到精通

类加载器

Jvm第九期的 图片素材:
https://www.liuchengtu.com/lct2021/#R6035e93def743092f023343f60cc6173

什么是类加载器

将我们的class文件读取到内存中
类加载器加载的过程
类加载器加载我们的class文件,并且经历过验证、准备、解析,在初始化我们该类。
Class文件读取来源
1.本地磁盘文件 java源代码编译的class文件
2.通过网络下载的class文件
3.War、Jar解压的class文件
4.从专门的数据库中读取的class文件
5.使用java cglib、动态代理生成的代理类class文件
Jvm虚拟机中 通过 类加载器(用户可以自定义类加载器)

类加载器的分类

1.启动(Bootstrap)类加载器:加载JVM自身工作需要的类,它由JVM自己实现。它会加载 J A V A H O M E / j r e / l i b 下 的 文 件 底 层 是 C 语 言 实 现 2. 扩 展 ( E x t e n s i o n ) 类 加 载 器 : 它 是 J V M 的 一 部 分 , 由 s u n . m i s c . L a u n c h e r E x t C l a s s L o a d e r 实 现 , 他 会 加 载 E x t C l a s s L o a d e r 实 现 , 他 会 加 载 E x t C l a s s L o a d e r 实 现 , 他 会 加 载 J A V A H O M E / j r e / l i b / e x t 目 录 中 的 文 件 ( 或 由 S y s t e m . g e t P r o p e r t y ( “ j a v a . e x t . d i r s ” ) 所 指 定 的 文 件 ) 。 底 层 是 J a v a 实 现 3. ( 应 用 ) A p p C l a s s L o a d e r 类 加 载 器 : 应 用 类 加 载 器 , 我 们 工 作 中 接 触 最 多 的 也 是 这 个 类 加 载 器 , 它 由 s u n . m i s c . L a u n c h e r JAVA_HOME/jre/lib下的文件 底层是C语言实现 2.扩展(Extension)类加载器:它是JVM的一部分,由sun.misc.LauncherExtClassLoader实现,他会加载ExtClassLoader实现,他会加载ExtClassLoader实现,他会加载JAVA_HOME/jre/lib/ext目录中的文件(或由System.getProperty(“java.ext.dirs”)所指定的文件)。 底层是Java实现 3.(应用)AppClassLoader 类加载器:应用类加载器,我们工作中接触最多的也是这个类加载器,它由sun.misc.Launcher JAVAH?OME/jre/libC2.ExtensionJVMsun.misc.LauncherExtClassLoaderExtClassLoaderExtClassLoaderJAVAH?OME/jre/lib/extSystem.getProperty(java.ext.dirs)Java3.AppClassLoadersun.misc.LauncherAppClassLoader实现。他加载我们工程目录classpath下的class及jar包 底层是java实现
4.自定义类加载器: 也就是用户自己定义的类加载器

Launcher 源码解读

Launcher.ExtClassLoader var1;
try {
// 获取到我们扩展类加载器
var1 = Launcher.ExtClassLoader.getExtClassLoader();
} catch (IOException var10) {
throw new InternalError(“Could not create extension class loader”, var10);
}

try {
//获取到我们应用类加载器
this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
} catch (IOException var9) {
throw new InternalError(“Could not create application class loader”, var9);
}
// 当前程序启动的线程 默认的 ClassLoader 应用类加载器
Thread.currentThread().setContextClassLoader(this.loader);
String var2 = System.getProperty(“java.security.manager”);
if (var2 != null) {
SecurityManager var3 = null;
if (!“”.equals(var2) && !“default”.equals(var2)) {
try {
var3 = (SecurityManager)this.loader.loadClass(var2).newInstance();
} catch (IllegalAccessException var5) {
} catch (InstantiationException var6) {
} catch (ClassNotFoundException var7) {
} catch (ClassCastException var8) {
}
} else {
var3 = new SecurityManager();
}

那些操作会初始化类加载器
类的主动使用:

1.调用类的静态方法
2.invokeStatic 调用静态方法
3.Main
4.New
5.Class.formname
6.子类初始化一定会初始化父类
初始化一个类,那么一定会触发类加载器
但是类加载器加载了该类,但是该类不一定初始化。

类加载器的双亲委派机制
首先在我们类加载器分为四种 自定义类加载器、应用类加载器、扩展类加载器、启动类加载器。
当一个类加载器收到请求之后,首先会依次向上查找到最顶层类加载器(启动类加载器),依次向下加载class文件,如果已经加载到class文件,子加载器不会加继续加载该class文件。
双亲委派机制机制的好处
目的就是为了防御开发者为定义的类与jdk定义源码类产生冲突问题,保证该类在内存中的唯一性。
ClassLoader源码解读

Launcher类源码解读

public Launcher() {    Launcher.ExtClassLoader var1;    try {//获取我们的扩展类加载器var1 = Launcher.ExtClassLoader.getExtClassLoader();    } catch (IOException var10) {throw new InternalError("Could not create extension class loader", var10);    }    try {// 获取我们的应用类加载器this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);    } catch (IOException var9) {throw new InternalError("Could not create application class loader", var9);    }    // 默认设置我们的类加载器是为应用类加载器    Thread.currentThread().setContextClassLoader(this.loader);    String var2 = System.getProperty("java.security.manager");    if (var2 != null) {SecurityManager var3 = null来源:陌陌龙
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月22日
下一篇 2022年5月22日

相关推荐