JVM类加载机制详解以及深入理解双亲委派模型

JVM类的加载机制

  • 类加载全过程
  • 类的加载器
  • 双亲委派机制
    • 双亲委派的优点
    • 全盘负责委托机制
  • 自定义加载器
    • 打破双亲委派机制
    • tomcat的类加载机制

类加载全过程

JVM类加载机制详解以及深入理解双亲委派模型_第1张图片
经过验证,解析等一系列的操作变成类元信息放到内存中

  1. 加载:在磁盘上找到对应的类,通过io读取字节码文件,使用到类的时候才会加载到内存区域中,在加载阶段会在内存中生成类的class对象,作为方法区这个类的各种数据的访问接口
  2. 验证:验证字节码文件的正确性
  3. 准备:给类的静态变量做一些初始值的赋值,如int赋值0,对象赋值为null。
  4. 解析:讲符号引用替换为直接引用,改阶段会
  5. 初始化: 对类的静态变量初始化为指定的值,执行静态代码块

tips:可以用javap -v xxx.class 反编译出类的汇编指令,查看类解析过程中的信息,如常量池等

类的加载器

  • 引导类加载器:负责加载支持JVM运行位于JRE的lib目录下的核心类库,比如rt.jar,charsets.jar
  • 扩展类加载器(extClassLoad):负责加载支持JVM运行位于JRE的lib目录下的ext扩展目录中的JAR类包,如dnsns.jar
  • 应用程序加载器(AppClassLoad):负责加载ClassPath路径下的类包,主要是加载自己开发写的类
  • 自定义加载器:负责加载自己自定义路径下的类包

双亲委派机制

加载某个类的时候,会先委托父加载器寻找目标类,找不到在委父加载器的父加载器进行加载,如果所有父加载器再自己的加载类路径下都招不到目标类,则在自己的类加载路径中查找并载入目标类。
如果自己写一个类,JVM会使用应用程序加载类AppClassLoader进行加载,appClassLoader会先检查LoadedClass判断自己是否已经加载过,如果加载过返回,没有加载委托父加载器扩展类加载器ExtClassLoader进行加载,extClassLoad同样操作后,委托自己的父加载器应用程序类加载器进行加载,如果自己没有找到则退回给extClassLoader进行加载,extClassLoader同样操作后,退给AppClassLoader进行加载,最后找到需要加载的目标类。

AppClassLoader和extClassLoader都会调用URLClassLoader的findClass方法在加载器中查找并加载

JVM类加载机制详解以及深入理解双亲委派模型_第2张图片

双亲委派的优点

  1. 沙箱安全机制:自己写的同包同名的类和jdk的核心类重名时候,保证自己写的不会被加载,防止API库随意被篡改
  2. 避免类的重复加载:当父加载器加载过该类时,就没有必要子加载器再加载一遍,保证被加载类的唯一

全盘负责委托机制

全盘负责是指当一个ClassLoader装载一个类的时候,除非有特殊指定另外一个ClassLoader去加载,否则JVM会使用同一个ClassLoader去加载这个类所依赖的全部引用类。

自定义加载器

自定义加载器需要extends ClassLoader,然后复写ClassLoader的findClass方法。自定义加载器的父加载器是AppClassLoader。

打破双亲委派机制

自定义加载器打破双亲委派机制的方法是重写ClassLoader的loadClass方法,修改向上委派的代码,有一个小坑是java中的所有类都是继承Object类,而Object的类是java的核心包中的核心类,是不允许重写的,打破双亲委派机制后,不会加载jdk的Object类,这也是java的沙箱安全机制,会触发java.lang.SecurityException:Prohibited package name,而Object类必须要有引导类加载器去加载,所以要在代码中做判断,加载自己自定义的类的时候才打破双亲委派机制,其他的情况下不打破双亲委派机制。

tomcat的类加载机制

tomcat其实也是用了自定义加载器WebAppClassLoader,为没有个jar或者war自定义一个新的类加载器,每一个jsp对应一个自己的类加载器,正因如此才可以实现热加载,这样可以在不同的应用上实现环境隔离,当然tomcat的lib目录下也是自己特有的类加载器进行加载的,如CommonClassLoader加载器加载Common文件,CatalinaClassLoader加载器加载Server文件,ShardClassLoader加载器加载Shard文件。

你可能感兴趣的:(专题博客,jvm,java,spring)