什么是双亲委派机制?

什么是双亲委派机制?

Parent Delegation Model ,直译过来可能叫做父级委托模型更容易理解

类的加载过程

  • Java 编译器将 Java源文件编译成.class 文件
  • 再由 JVM 加载 .class 文件到内存中
  • JVM 装载完成后得到一个 Class 字节码对象
  • 拿到字节码对象之后 ,就可以实例化了
  • 类的加载过程需要使用到加载器,JVM 设计了 3 个类加载器 ,分别是 :Bootstrap 类加载器、 Extension 类加载器和 应用类加载器
  • 这些类加载器分别加载不同作用范围的 jar 包和.class 文件
    • Bootstrap ClassLoader ,主要是负责 Java 核心类库的加载 ,也就是 %{JDK_HOME}\lib 下的 rt.jar、resources.jar 等
    • Extension ClassLoader ,主要负责%{JDK_HOME}\lib\ext 目录下的 jar 包和 class 文件
    • Application ClassLoader ,主要负责当前应用里面的 classpath 下的所有 jar 包和类文件
  • 除了系统自己提供的类加载器以外,还可以通过 ClassLoader 类实现自定义加载器,去满足一些特殊场景的需求

双亲委派机制

  1. 双亲委派机制 ,也叫父级委托模型 ,就是指按照类加载器的层级关系 ,逐层进行委派
  2. 我们需要加载一个 class 文件的时候,首先会把这个 class 的查询和加载委派给父加载器去执行
  3. 如果父加载器都无法加载 ,再尝试自己来加载这个 class

意义?

  1. 保证安全性,因为这种层级关系实际上代表的是一种优先级,也就是所有的类的加 载 ,优先给 Bootstrap ClassLoader
  2. 对于核心类库中的类 ,就没办法去破坏, 比如自己写一个 java.lang.String ,最终还是会交给 Bootstrap 类加载器加载,再加上每个类加载器都有不同的作用范围 ,这就意味着自己写的 java.lang.String 没办法去覆盖核心类库中类
  3. 避免重复加载,这种层级关系的设计,可以避免类重复加载导致程序混乱的问题
  4. 即如果父加载器已经加载过了 ,那么子加载器就没必要去加载了

Tomcat的自定义类加载器

Tomcat在初始化的时候自定义了三个类加载器和其他的两个类加载器

  1. CommonLoader:加载Tomcat所需要的jar包和class文件,可以被Tomcat容器本身以及各个Webapp访问;
  2. CatalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
  3. SharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,对于Tomcat不可见;
  4. WebAppClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;
  5. JasperLoader:它出现的目的就是为了被丢弃,加载路径仅仅是某个JSP文件所编译出来的那一个.class文件;

意义?

  1. 隔离同类库不同版本,因为Tomcat是可以部署多个Web应用程序的
  2. 共享同类库同版本,多个应用程序如果依赖相同类库的相同版本,应该共享同类库的同版本,避免重复的类库被加载进JVM
  3. 隔离Tomcat与应用程序的类库,Tomcat也有自己依赖的类库,不能与应用程序的类库冲突
  4. 热部署,修改jsp内容后无需重启项目将它重新加载到内存中,每个jsp对应一个唯一的类加载器,当检测到jsp内容发生更改的时候,直接卸载唯一的类加载器,然后重新创建类加载器,并加载jsp文件。

你可能感兴趣的:(#,日积月累,java,开发语言)