JVM_双亲委派机制
2024-10-07 09:16:54
双亲委派机制及作用
什么是双亲委派机制
当`.class`文件需要被加载时,它首先把这个任务委托给他的上级类加载器,层层往上委托,如果上级的类加载器没有加载过,自己才会去加载这个类。
源码分析
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 首先,确保是个类是否已经被加载
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
// 递归往上去验证
c = parent.loadClass(name, false);
} else {
//如果递归到了bootStrapClassloader了或者父类的加载器为空
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
}
if (c == null) {
// 如果双亲没有加载过,则自行加载
long t1 = System.nanoTime();
c = findClass(name);
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
虚拟机自带的加载器以及优先级:
- bootstrap(根类加载器/引导类加载器,由C++编写)=> 加载 jre/lib/rt.jar 中的类
- ext(扩展类加载器)=> 加载 jre/lib/ext/ *.jar 中的类
- app(应用程序类加载器)=> 加载当前项目中classpath:下所有的类
- 用户自定义类加载器 => 定义类来继承ClassLoader抽象类,即 MyClassLoader extends ClassLoader
来测试一下“双亲委派机制”的效果!
分析:我自己创建了一个java.lang.String ,我在里面定义了main方法,并执行,但是结果却报错,说找不到这个方法。那么则意味着,JVM 中加载的Class文件,根本不是我自己定义的这个。
结论:执行方法,是从上(双亲)往下找,寻找双亲中,有没有这个类,JVM优先加载双亲中辈分较高的类加载器中的类。
作用:其目的,应该就是保护JDK中的类的加载不会被我们自定义的干扰。
最新文章
- SQL日期格式,转自will哥
- json中$ref对象重复引用问题
- 如何判断js中对象的类型
- BASE64 官方方法,我自己用的,注意记住换行问题。
- DKNightVersion 的实现 --- 如何为 iOS 应用添加夜间模式
- php 修改、增加xml结点属性的实现代码
- 【linux】cut
- jquery 简单弹出层(转)
- 链表-Reverse Linked List II
- linux内核源码阅读之facebook硬盘加速flashcache之三
- Android网络电话软件Sipdroid试用
- POJ 1324 Holedox Moving 搜索
- hash冲突随笔
- 【一天一道LeetCode】#242. Valid Anagram
- 打开Visual Studio 2010,左下角显示正在从包...加载工具箱内容,卡住5、6秒!!!
- openflow控制器和交换机之间的消息
- SNMP mib文件说明
- LeetCode--032--最长有效括号(java)
- Https 单向验证 双向验证
- HTML 5 Web 本地存储