JVM类加载 & Tomcat类加载

JVM类加载

1.根类加载器:BootstrapClassLoader

由C++编写,没有父加载器,加载JVM核心类库(jdk/jre/lib目录下),没有继承java.lang.ClassLoader

2.扩展类加载器:ExtensionClassLoader

由Java实现,父加载器为Bootstrap,加载扩展类库(jdk/jre/lib/ext目录下),继承java.lang.ClassLoader

3.系统类(应用类)加载器:AppClassLoader

由Java实现,父加载器为Extension,加载环境变量classpath或系统属性java.class.path目录中加载类库,继承java.lang.ClassLoader,它是用户自定义类加载器的默认父加载器

4.用户自定义类加载器:User defined Class Loader

必须继承java.lang.ClassLoader

注:父子类加载器并非是继承关系,也就是说子加载器不一定继承了父加载器


双亲委派模型

1.双亲委派模型

类加载器之间的委托机制,就是双亲委派模型

2.双亲委派模型工作过程

当一个类加载器,接收到类加载请求之后,会先委托给父加载器,每一层加载器都是如此,最终先由BootstrapClassLoader加载,如果父加载器加载不了,再由子加载器加载,当所有加载器加载不了,就会报出ClassNotFound

3.父委托机制的优点

提高了系统的安全性,如果不是父委托机制,那么就是我自己定义的恶意类可以让我自己的类加载器加载,从而造成系统的风险

TomcatClassLoader的委托机制

1.TomcatClassLoader执行流程

Tomcat违反了双亲委派模型;当接收到类加载请求后,没有委托给上层的commonClassLoader,而是委托给了SystemClassLoader,然后自己加载,最后才委托给commonClassLoader

2.违反双亲委派的例子

Tomcat、JDBC、JNDI、OSGi


Tomcat的类加载顺序

当应用需要用到某个类时,则会按照下面的顺序进行类加载

  1. 使用bootstrap引导类加载器加载
  2. 使用system系统类加载器加载
  3. 使用应用类加载器在WEB_INF/classes中加载
  4. 使用应用类加载器在WEB_INF/lib中加载
  5. 使用common类加载器在CATALINA_HOME/lib中加载

你可能感兴趣的:(JDK)