jvm学习-ClassLoader

Posted lqblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm学习-ClassLoader相关的知识,希望对你有一定的参考价值。

ClassLoader结构

技术分享图片

jdk加载的4个步骤

       CustomClassLoader 用户自定义的classLoader

       APPClassLoader主要加载classPath下面的class

       Extension ClassLoader 主要负责加载JAVA_HOME/jre/lib/ext/目下的所有jar

       BootStrap ClassLoader:负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等

java类加载器采用双亲委托模式

                 则是从下级往上级询问是否有加载。如果没加载 再从上级往下下级查找 如果找到就加载 没有找到就继续向下询问

                 比如 在程序创建一个Test类。然后在main方法打印这个这个Test类的classLoader 会打印 APPClassLoader

                          因为appClassLoader会逐个向上询问是否加载  则都没有加载  然后从上级bootstrap到Extension ClassLoader会在他的扫描的jar里面找有没有Test这个class都没有找到 最终APPClassLoader在classPath找到这个类  加载

                 我们改变一下程序 将Test类打包成一个jar 放到ext目录下

                       再次打印则会输出加载类是Extension ClassLoader

双亲委托模式的好处

             1. 防止重复加载

缺点 :

          上层类加载器无法获得下层类加载器加载的类

双亲委托模式是jdk的默认实现 但是不一定要完全按照这个模式

         比如tomcat webappClassLoader 就会先加载自己的class  找不到再委托父类

自定义ClassLoader 必须继承 classLoader类

   classLoader的重要方法

                    loadClass(String name)文件名字

             defineCalss(byte[] b int off,int lent) class文件的内容
        findClass() loadClass会掉findClass方法
        findLadedClass(String name) 如果加载了 则不加载 没加载 才加载
为什么要重写classLoader
     因为默认实现的几种classLoader只会加载特定路径下面的class     我们往往会根据需求加载别的路径下的class 比如网络请求的class二进制信息

以上是关于jvm学习-ClassLoader的主要内容,如果未能解决你的问题,请参考以下文章

JVM学习资料

JVM学习--垃圾回收机制

JVM学习--JVM运行时数据区图文详解

JVM 内存结构 -- 什么是JVM学习JVM的好处学习路线(JVM的组成)程序计数器虚拟机栈(栈内存溢出线程运行诊断)

JVM学习

小白学习JVM--概述和模型