从源码角度学习JVM类加载器及自定义类加载器
2023-02-18 16:38:05 时间
B站搜索“乐哥聊编程“有本篇文章配套视频 https://www.bilibili.com/video/BV1cP4y117Qt
类加载器分类
引导类加载器(「Bootstrap ClassLoader」)
负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,这个加载器是由C++写的,所以我们在java源码里面是找不到它的实现,如果尝试对它进行打印,输出将为空值。
扩展类加载器(「Extension ClassLoader」)
负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包,也可以使用java.ext.dirs来指定路径,一般保持默认就好。
应用程序类加载器(「Application ClassLoader」)
负责加载类路径下的jar包和class文件,我们自己写的代码都是通过这个类加载加载的
自定义类加载器
我们自己去实现的类加载器,其父类加载器为应用程序类加载器。
类加载器之间的关系
验证类加载器加载的路径
package com.lglbc.day1;
import sun.misc.Launcher;
import java.net.URL;
/**
* @Description TODO
* @Author 乐哥聊编程
* @Date 2022/11/13 20:57
*/
public class TestClassLoader {
public static void main(String[] args) {
System.out.println(String.class.getClassLoader());
System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());
System.out.println("===============手动分割================");
ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
ClassLoader extClassloader = appClassLoader.getParent();
ClassLoader bootstrapLoader = extClassloader.getParent();
System.out.println("the bootstrapLoader : " + bootstrapLoader);
System.out.println("the extClassloader : " + extClassloader);
System.out.println("the appClassLoader : " + appClassLoader);
System.out.println("===============手动分割================");
System.out.println("bootstrapLoader加载以下文件:");
URL[] urls = Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i]);
}
System.out.println("===============手动分割================");
System.out.println("extClassloader加载以下文件:");
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println("===============手动分割================");
System.out.println("appClassLoader加载以下文件:");
System.out.println(System.getProperty("java.class.path"));
}
}
类加载器初始化过程(源码解读)
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;
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();
}
if (var3 == null) {
throw new InternalError("Could not create SecurityManager: " + var2);
}
System.setSecurityManager(var3);
}
}
相关文章
- Acrobat最经典的版本:PDF编辑器Acrobat 2021经典版,下载
- Adobe Acrobat Pro DC 2019(PDF) 软件下载安装包教程(附下载方法)
- Adobe Acrobat Pro DC 2018(PDF) 软件下载安装包教程(附下载方法)
- 仅需1% Embedding参数,硬件成本降低十倍,开源方案单GPU训练超大推荐模型
- 文件更小,质量更高,大火的Stable Diffusion还能压缩图像?
- 11分钟充电70%,华人教授在锂电池中加镍箔登上Nature
- 戴着VR头盔教机器人抓握,机器人当场就学会了
- 还未入职,这位将来的博导为学生规划了一条高效学习之路
- 英特尔i9-13900K重夺PC性能桂冠:与AMD 7950X拉开8%差距
- 价值1亿美金时,Stable Diffusion背后的团队开始互撕,谁才是真官方?
- NeurIPS 2022 | 用变分编码器生成周期图,时间、空间复杂度最低
- Bengio、LeCun 等人联名上书,呼吁美国投资神经AI,攻破「具身图灵测试」
- 30亿跑赢GPT-3的1750亿,谷歌新模型引热议,然而却把Hinton年龄搞错了
- Stable Diffusion新玩法,一句话帮你换图,网友魔改《戴珍珠耳环的少女》长这样
- LeCun转推,PyTorch GPU内存分配有了火焰图可视化工具
- ECCV 2022 | 摆脱部件标签依赖,上科大&ZMO.AI提出分部件3D人体重建与驱动新方法UNIF
- 清华作者排名第一,多人中稿超十篇:NeurIPS 2022统计数据出炉
- Transformer作者离职创业的公司,想从老东家谷歌再拿2亿美元融资
- 谷歌并未放弃TensorFlow,将于2023年发布新版,明确四大支柱
- 打破不可能三角、比肩5400亿模型,IDEA封神榜团队仅2亿级模型达到零样本学习SOTA