JVM_双亲委派机制
双亲委派机制及作用
什么是双亲委派机制
当`.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优先加载双亲中辈分较高的类加载器中的类。
浙公网安备 33010602011771号