tomcat之类加载机制

一、JVM类加载机制简介 

JVM的类加载机制:【十五】JVM类加载、双亲委派模型简述笔记

简述JVM双亲委派模型:

1.每个类加载器收到了类加载请求,会先检查该类是否已经被加载过了。

2.如果该类没有被加载过,它会把请求委派给父类加载器(调用父类加载器的loadClass()方法)去完成。

如果父类加载器为空,默认使用启动类加载器作为父类加载器。

3.只有父类加载器无法加载这个类(它的搜索范围中没有找到所需的类),子类加载器才会尝试自己加载该类。

 二、TOMCAT类加载机制

tomcat实现了几个用户自定义类加载器

1.Common类加载器,负责加载Tomcat和Web应用都复用的类。

加载tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar

2.Catalina类加载器,负责加载Tomcat专用的类,而这些被加载的类在Web应用中将不可见。

3.Shared类加载器,负责加载Tomcat下所有的Web应用程序都复用的类,而这些被加载的类在Tomcat中将不可见。

4.WebApp类加载器,负责加载具体的某个Web应用程序所使用到的类,而这些被加载的类在Tomcat和其他的Web应用程序都将不可见。通常会存在多个实例,每一个Web应用程序对应一个WebApp类加载器

每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于 WEB-INF/lib下的jar文件中的class 和 WEB-INF/classes下的class文件

5.Jsp类加载器,通常会存在多个实例,每个jsp页面一个类加载器,不同的jsp页面有不同的类加载器,方便实现jsp页面的热插拔。

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

  1 使用bootstrap classloader引导类加载器加载

  2 使用application classloader系统类加载器加载

  3 使用应用类加载器在WEB-INF/classes中加载

  4 使用应用类加载器在WEB-INF/lib中加载

  5 使用common类加载器在CATALINA_HOME/lib中加载

所以上次在项目代码里面重写amqp-client的一个类,启动的时候会先加载我重写的这个类,而不加载amqp-client里面本来的这个类。

因为项目代码里面写的东西编译了之后在 WEB-INF/classes中,而第三方引用包amqp-client在WEB-INF/lib中,我代码里面重写的类会先加载。

三、违反双亲委托机制

tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双亲委托。具体的加载逻辑位于WebAppClassLoaderBase.loadClass()方法中,代码篇幅长,这里以文字描述加载一个类过程:

  1. 先在本地缓存中查找是否已经加载过该类(对于一些已经加载了的类,会被缓存在resourceEntries这个数据结构中),如果已经加载即返回,否则 继续下一步。
  2. 让系统类加载器(AppClassLoader)尝试加载该类,主要是为了防止一些基础类会被web中的类覆盖,如果加载到即返回,返回继续。
  3. 前两步均没加载到目标类,那么web应用的类加载器将自行加载,如果加载到则返回,否则继续下一步。
  4. 最后还是加载不到的话,则委托父类加载器(Common ClassLoader)去加载。

第3第4两个步骤的顺序已经违反了双亲委托机制,除了tomcat之外,JDBC,JNDI,Thread.currentThread().setContextClassLoader();等很多地方都一样是违反了双亲委托。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值