简介总对于双亲委派模型我从几个方面来介绍类加载类加载器双亲委派模型好处打破双亲委派以及JDK8到9模型产生的变化六个方面。类加载分1首先是类加载当我们new一个对象实例时或者执行某类的main方法时都会触发类加载类加载的作用就是为了让JVM认识这个类知道它的各种信息比如字段方法继承了哪些类方法内引用了哪些对象实例需要分配多大内存等等类加载有五个阶段加载、验证、准备、解析、初始化。不过本题我们关注的不是加载过程中而是加载之前这个类加载请求是由谁呈递的那答案是类加载器。类加载器分2JVM设计了三层类加载器负责加载不同的类每层类加载器都有自己负责的范围分别是启动类加载器扩展类加载器应用类加载器。启动类加载器是最顶层的负责加载JAVA_HOME/lib目录中的Jar包扩展类加载器负责加载JAVA_HOME/lib/ext目录中的Jar包应用类加载器负责加载当前项目路径下的类和引入的三方依赖。双亲委派模型分3那双亲委派模型就是指这些类加载器的加载优先级子类加载器收到类请求后优先委派给父类加载器如果父类加载器无法加载自己再加载这就是双亲委派模型。好处 分4双亲委派模型有两点主要好处保证核心类库的安全比如我自己写了一个java.lang.String.class放在项目路径下属于应用类加载器负责的范围当触发String的类加载时应用类加载器接受到请求后不会自己加载而是优先交给扩展类加载器扩展类再交给启动类加载器启动类加载器检索类库找到了核心类java.lang.String.class执行类加载。这证明了核心类不会被自己写的同名类替代保证安全。避免重复加载当启动类加载器加载了String类之后扩展类和应用类加载器就不会再加载了加载请求结束了。打破分5有没有特殊场景需要打破双亲委派模型呢有的兄弟有的那就是Tomcat这是一个Web服务器Tomcat运行多个应用不同应用可能使用不同的依赖版本这是Tomcat的需求。而双亲委派模型会使这些应用加载同一个版本所以Tomcat自己实现了WebAppClassLoader类重写了loadClass()方法重写逻辑变成先自己加载找不到再委派给父类。Tomcat运行应用时为每个应用创建WebAppClassLoader实例实现了应用隔离。这样做的好处除了隔离性之外还有热部署和安全性。重新部署应用时将之前WebAppClassLoader删掉重新创建一个不会被缓存干扰不同的应用不能访问各自的类因为加载器实例不同。迭代变化分6JDK8是个分水岭类加载器和双亲委派模型都有变化类加载器将扩展类加载器变成了平台类加载器并且加载器的加载模式变了不再是以前的匹配路径加载Jar包而是加载模块启动类加载器加载java.base等核心模块平台累加载器加载java.saljava.xml等非核心但常用的模块应用类加载器加载项目中自己写的类和三方依赖三方依赖可能是模块也可能是原始Jar包。那模块到底是什么呢其实就是加入了一些额外信息的Jar包主要包括依赖信息。这个依赖信息导致双亲委派模型也有变化委派逻辑不再是严格的向上委派而是根据模块间的依赖关系进行委派比如java.xml模块依赖应用类加载器负责的A模块那加载java.xml模块的类之前先要委托应用类加载器加载A模块之后再加载java.xml的类。这样做的好处就是更加灵活。
模拟面试回答第十四问:双亲委派模型
简介总对于双亲委派模型我从几个方面来介绍类加载类加载器双亲委派模型好处打破双亲委派以及JDK8到9模型产生的变化六个方面。类加载分1首先是类加载当我们new一个对象实例时或者执行某类的main方法时都会触发类加载类加载的作用就是为了让JVM认识这个类知道它的各种信息比如字段方法继承了哪些类方法内引用了哪些对象实例需要分配多大内存等等类加载有五个阶段加载、验证、准备、解析、初始化。不过本题我们关注的不是加载过程中而是加载之前这个类加载请求是由谁呈递的那答案是类加载器。类加载器分2JVM设计了三层类加载器负责加载不同的类每层类加载器都有自己负责的范围分别是启动类加载器扩展类加载器应用类加载器。启动类加载器是最顶层的负责加载JAVA_HOME/lib目录中的Jar包扩展类加载器负责加载JAVA_HOME/lib/ext目录中的Jar包应用类加载器负责加载当前项目路径下的类和引入的三方依赖。双亲委派模型分3那双亲委派模型就是指这些类加载器的加载优先级子类加载器收到类请求后优先委派给父类加载器如果父类加载器无法加载自己再加载这就是双亲委派模型。好处 分4双亲委派模型有两点主要好处保证核心类库的安全比如我自己写了一个java.lang.String.class放在项目路径下属于应用类加载器负责的范围当触发String的类加载时应用类加载器接受到请求后不会自己加载而是优先交给扩展类加载器扩展类再交给启动类加载器启动类加载器检索类库找到了核心类java.lang.String.class执行类加载。这证明了核心类不会被自己写的同名类替代保证安全。避免重复加载当启动类加载器加载了String类之后扩展类和应用类加载器就不会再加载了加载请求结束了。打破分5有没有特殊场景需要打破双亲委派模型呢有的兄弟有的那就是Tomcat这是一个Web服务器Tomcat运行多个应用不同应用可能使用不同的依赖版本这是Tomcat的需求。而双亲委派模型会使这些应用加载同一个版本所以Tomcat自己实现了WebAppClassLoader类重写了loadClass()方法重写逻辑变成先自己加载找不到再委派给父类。Tomcat运行应用时为每个应用创建WebAppClassLoader实例实现了应用隔离。这样做的好处除了隔离性之外还有热部署和安全性。重新部署应用时将之前WebAppClassLoader删掉重新创建一个不会被缓存干扰不同的应用不能访问各自的类因为加载器实例不同。迭代变化分6JDK8是个分水岭类加载器和双亲委派模型都有变化类加载器将扩展类加载器变成了平台类加载器并且加载器的加载模式变了不再是以前的匹配路径加载Jar包而是加载模块启动类加载器加载java.base等核心模块平台累加载器加载java.saljava.xml等非核心但常用的模块应用类加载器加载项目中自己写的类和三方依赖三方依赖可能是模块也可能是原始Jar包。那模块到底是什么呢其实就是加入了一些额外信息的Jar包主要包括依赖信息。这个依赖信息导致双亲委派模型也有变化委派逻辑不再是严格的向上委派而是根据模块间的依赖关系进行委派比如java.xml模块依赖应用类加载器负责的A模块那加载java.xml模块的类之前先要委托应用类加载器加载A模块之后再加载java.xml的类。这样做的好处就是更加灵活。