JVM学习笔记——类加载机制

先了解4种类加载器

  1. 启动类加载器 BootstrapClassLoader
    负责加载JRE的核心类库,如JRE的rt.jar,charsets.jar
  2. 扩展类加载器 ExtClassLoader
    负责加载JRE扩展目录ext中的jar包
  3. 系统类加载器 ApplicationClassLoader
    负责加载classpath路径下的类包(用户自己创建的类)
  4. 用户自定义类加载器 CustomClassLoader
    负责加载用户自定义路径下的类包

全盘委托类加载机制

当ClassLoader加载一个类时,除非显示调用另一个ClassLoader,否则该类所依赖或者引用的类都由这个ClassLoader进行加载。

双亲委派机制

自己创建的类用系统类加载器进行加载,当JVM进行加载时,首先会将要加载的类委托给扩展类加载器查看有没有加载过,扩展类加载器去找这个目标类,找不到则继续向上委托给启动类加载器进行查询,找不到就判断一下自己能不能进行加载,如果可以加载就会在自己这边进行加载,加载不了就把这个类交给子类,让子类进行加载。
一层一层向上递交,加载不了的则交给子加载器进行加载
JVM学习笔记——类加载机制_第1张图片

双亲委派机制优势

  • 避免重复
    当父类的classLoader对一个类进行了加载,就不需要子类的classLoader加载
  • 安全
    当自定义类与核心类库中的具有相同的完全限定名时,例如自定义一个java.lang.String,这个类不会被加载,可以防止核心类库被随意篡改

为什么要打破双亲委派机制

以Tomcat容器为例,一个Tomcat容器等于跑一个JVM,但是在这同一个JVM中可部署多个应用(war包),当多个应用使用同一个jar资源时,则会产生冲突;Tomcat为了做出这种隔离,Tomcat使用自己独特的类加载机制,通过自定义的类加载器打破双亲委派机制。

两个应用在同一个JVM中,他们同时加载同一个jar包,而且这个jar包中的类权限定名相同,如果采用系统类加载器,内存中只用一个class,使用时冲突;而让每个应用都使用自己的自定义的类加载器,保证了虽然使用同一份文件,但在内存中有两个模板信息。

你可能感兴趣的:(JVM)