类加载机制

86 阅读2分钟

一、类加载机制是怎么样的?

  1. 装载:装载时机(懒装载,用到的时候才装载)、规则(核心方法由启动类加载器加载、扩展方法由扩展类加载器加载、程序中的类文件由系统加载器加载、自定义方法由自定义类加载器加载)、发生(防止内存中出现多份同样的字节码,使用双亲委派机制)
  2. 连接:验证(看是否符合java规范和JVM规范)、准备(给静态变量分配内存与赋初值)、解析(符号引用转为直接引用的过程)
  3. 初始化:为类的静态变量赋予正确的初始值

二、双亲委派机制原理与作用是什么?

  1. 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
  2. 如果父类的加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终会到达顶层的启动类加载器
  3. 如果父类加载器可以完成类加载任务,就成功返回,倘若无法完成此加载任务,则委派给它的子加载器去加载
  4. 防止加载同一个.class
  5. 保证核心.class不被篡改,例如自定义的方法名称与核心方法名称相同,则只加载核心方法,防止核心方法受影响

三、如何打破双亲委派机制?tomcat打破双亲委派机制的目的是什么?

  1. 重写classloader中的loadclass方法
  2. tomcat有多个web服务器,当两个及以上服务器需要同一个jar包的不同版本的时候,若使用双亲委派机制则只能加载一个版本的该jar包,故打破双亲委派机制,来拿到不同版本的jar包