1、BootStrapClassLoader:启动类加载器,该ClassLoader是在启动时候创建的,是写在JVM"/>

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 类加载器   双亲委派机制的主要内容,如果未能解决你的问题,请参考以下文章

为什么JVM的类加载要采用双亲委派的加载机制?

关于Java类加载双亲委派机制的思考(附一道面试题)

java双亲委派机制及作用

双亲委派机制JVM:类加载机制深度剖析 - 第7篇

JVM系列:Java类加载机制之双亲委派模型

深入JVM系列之类加载类加载器双亲委派机制与常见问题