java 类加载器 双亲委派机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 类加载器 双亲委派机制相关的知识,希望对你有一定的参考价值。
先上图,看一下加载器。
1、BootStrapClassLoader:启动类加载器,该ClassLoader是在启动时候创建的,是写在JVM内核里的,它不是一个字节码文件,是由c++编写的二进制代码,所以开发者无法获取到该启动类的引用,也就不能通过引用来进行操作。这个加载器是加载$JAVA_HOME/jre/lib下面的类库(或者通过参数-Xbootclasspath指定)。
2、EXTClassLoader:扩展类加载器,ExtClassLoader会加载 $JAVA_HOME/jre/lib/ext下的类库(或者通过参数-Djava.ext.dirs指定)。
3、AppClassLoader:应用程序加载器,会加载java环境变量CLASSPATH所指定的路径下的类库,而CLASSPATH所指定的路径可以通过Systemn.getProperty("java.class.path")获取,该变量可以覆盖。
4、CustomClassLoader:自定义加载器,就是用户自己定义的CLassLoader,比如tomcat的standardClassLoader属于这一类。
ClassLoader双亲委派机制:
1、当APPClassLoader加载一个class时,它首先不会自己去加载这个类,而是把类加载请求委派给父类加载器EXTClassloader去完成。
2、当EXTClassLoader加载一个class时,它首先不会去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
3、如果BottStrapClassLoader加载失败,会使用EXTClassLoader去尝试加载。
4、若EXTClassLoader也加载失败,则会使用APPClassLoader来加载,如果APPClassLoader也加载失败,则会报出异常ClassNotFundException.
委派机制具体含义和意义:
当java虚拟机要加载一个类时,到底要排除哪个类加载器去加载呢?
比如:当前线程的类加载器要去加载线程中一个类A,如果这个类A中引用了类B,java虚拟机将使用加载类A的加载器去加载类B。类B再使用的时候如果发现类B已经加载了,就不去加载这个类B了。
我觉得其意义是防止内存中出现多份同样的字节码。
如果不用委托而是自己加载自己的,那么类A就会加载一份System字节码,然后类B又会加载一份System字节码,这样内存中就出现了两份System字节码。
如果使用委托机制,会递归的向父类查找,也就是首选用Bootstrap尝试加载,如果找不到再向下。这里的System就能在Bootstrap中找到然后加载,如果此时类B也要加载System,也从Bootstrap开始,此时Bootstrap发现已经加载过了System那么直接返回内存中的System即可而不需要重新加载,这样内存中就只有一份System的字节码了。
本文出自 “10093778” 博客,谢绝转载!
以上是关于java 类加载器 双亲委派机制的主要内容,如果未能解决你的问题,请参考以下文章