【JVM加载】---类加载机制

为什么要设计双亲委派模型?

  1. 沙箱安全机制:防止核心API库被随意篡改
  2. 避免类的重复加载:当父亲已经加载了该类时,就没有必要让子classloader再加载一次,保证被加载类的唯一性

类加载机制
1.加载
2.验证【文件格式的正确性】
3.准备【类的静态变量内存,并且赋值为0】
4.解析【静态方法链接,将符号引用转换为直接引用】
5.初始化:对类的静态变量初始化为指定的值,执行静态代码块

双亲委派模型
启动类加载器,拓展类加载器,应用程序类加载器,自定义加载器【继承loadClass,重写findClass】

启动类加载器(Bootstrap ClassLoader):这个类加载器复杂将存放在 JAVA_HOME/lib 目录中的,或者被-Xbootclasspath 参数所指定的路径种的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录下也不会重载)

扩展类加载器(Extension ClassLoader):这个类加载器由sun.misc.Launcher$ExtClassLoader实现,它负责夹杂JAVA_HOME/lib/ext 目录下的,或者被java.ext.dirs 系统变量所指定的路径种的所有类库。开发者可以直接使用扩展类加载器。

应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader 实现。由于这个类加载器是ClassLoader 种的getSystemClassLoader方法的返回值,所以也成为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库。开发者可以直接使用这个类加载器,如果应用中没有定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器

在这里插入图片描述

为什么要打破双亲委派模型?

  • 有效解决项目中的包冲突,同时引入相同的类,但是jar包不一样,可以实现相互引入但是没有异常。经典代表就是tomcat和SPI协议。

猜你喜欢

转载自blog.csdn.net/changyinling520/article/details/116704011