tomcat类加载器

首先介绍下JVM的类加载器,如下图:

tomcat类加载器_第1张图片
JVM ClassLoader.png

包含启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System ClassLoader)这三个类加载器,它们依次成父子关系。在我们开发程序时通常会用到这3个类加载器,应用class path下的类会由系统类加载器加载,而且这3个类加载器遵循双亲委派规则,当加载1个类时会先委派给父类加载器加载,直到委派给根加载器,即启动类加载器,只有父加载器不能加载类时才会再交给子类加载。

tomcat自定义了4种类加载器,分别是commonClassLoader、catalinaClassLoader、sharedClassLoader和webappClassLoader,如下:

tomcat类加载器_第2张图片
tomcat自定义类加载器.png

commonClassLoader是catalinaClassLoader和sharedClassLoader共同的父加载器,sharedClassLoader是webappClassLoader的父加载器,但因为tomcat对于catalinaClassLoader和sharedClassLoader的默认设置是类路径为空,因此catalinaClassLoader和sharedClassLoader就跟commonClassLoader一样了,即tomcat默认设置下commonClassLoader 、catalinaClassLoader和sharedClassLoader这3个类加载器是同一个。webappClassLoader相当于每个部署在tomcat中的应用的类加载器,有多少个应用就有多少个独立的webappClassLoader,因此,tomcat的类加载器结构如下:

tomcat类加载器_第3张图片
classloader.png

对于WebappClassLoader,其默认的类加载规则不是双亲委派规则(当然也可以配置成双亲委派规则),在加载类时,会优先由自己加载(但java基础类和servlet-api的类除外),当自己加载不了时才交给父加载器加载,这种加载规则实现了应用间class的隔离。

你可能感兴趣的:(tomcat类加载器)