Tomcat的类加载机制

news/2024/10/30 9:36:19/

不遵循双亲委托

  在JVM中并不是一次性地把所有的文件都加载到,而是按需加载,加载机制采用 双亲委托原则,如下图所示:
在这里插入图片描述

  1. BootStrapClassLoader 引导类加载器
  2. ExtClassLoader 扩展类加载器
  3. AppClassLoader 应用类加载器
  4. CustomClassLoader 用户自定义类加载器

  类的加载过程是这样的: 用户自己的类加载器,把加载请求传给父加载器,父加载器再传给其父加载器,一直到加载器树的顶层; 最顶层的类加载器首先针对其特定的位置加载,如果加载不到就转交给子类;如果一直到底层的类加载都没有加载到,那么就会抛出异常ClassNotFoundException
  因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。
  Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给CommonClassLoader走双亲委托。对于标准类库中的类,会让系统类加载器加载,然后一直委托到启动类加载器,这个过程是没有违背双亲委派的。

Tomcat 的类加载机制

在这里插入图片描述

  启动类加载器(Bootstrap) 和 扩展类加载器 (Extension ClassLoader),Application ClassLoader(应用程序类加载器),这三个类加载和默认的一致。CommonClassLoader、CatalinaClassLoader、SharedClassLoader和WebappClassLoader则是Tomcat自己定义的类加载器。

  1. CommonClassLoader: Tomcat最基本的类加载器,加载路径中的class可以被Tomcat容器本身以及各个Webapp访问;位于CATALINA_HOME/lib下,⽐如servlet-api.jar;
  2. CatalinaClassLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
  3. SharedClassLoader:⽤于加载应⽤程序共享类,这些类服务器不会依赖,加载路径中的class对于所有Webapp可见,但是对于Tomcat容器不可见;
  4. WebappClassLoader:每个应用在部署后,都会创建一个唯一的类加载器,⽤来加载本应⽤程序 /WEB-INF/classes 和 /WEB-INF/lib 下的类。

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

  1. 使用bootstrap引导类加载器加载【一般为JVM启动所需的类,以及标准扩展类,位于jre/lib/ext】
  2. 使用系统类加载器加载【加载tomcat启动的类,比如bootstrap的类】
  3. 使用应用类加载器在WEB-INF/classes中加载
  4. 使用应用类加载器在WEB-INF/lib中加载
  5. 使用common类加载器在CATALINA_HOME/lib中加载

http://www.ppmy.cn/news/26918.html

相关文章

Docker 安装nacos并且配置数据库持久化(无脑CV版)

我们以运行ruoyi-cloud项目为例子 在安装之前请注意版本对应问题 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 由于我的是2021.0.4.0,因此安装2.0.4版本 否则可能会出现以下错误 在若依的issue有解决方案https:…

扬帆优配|3300点半日游!上证指数冲高回落;再迎重磅利好!

今天早盘,A股冲高回落,上证指数3300点得而复失,深证成指也于12000点无功而返。 盘面上,煤炭、钢铁、房地产、才智政务等板块涨幅居前,酿酒、酒店餐饮、日用化工、IT设备等板块跌幅居前。北上资金净流入7.77亿元。 房地…

.net 6 引入EFCore

这里默认使用sql server数据库 DBFirst nuget引入程序集 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore.Tools Microsoft.Extensions.Logging.Console 执行脚本 设置DAL…

用Python搓一个黑洞

文章目录简介单位制观测绘图简介 黑洞图像大家都知道,毕竟前几年刚发布的时候曾火遍全网,甚至都做成表情包了。 问题在于,凭什么认为这就是黑洞的照片,而不是一个甜甜圈啥的给整模糊了得到的呢?有什么理论依据吗&…

Python列表list操作-遍历、查找、增加、删除、修改、排序

在使用列表的时候需要用到很多方法,例如遍历列表、查找元素、增加元素、删除元素、改变元素、插入元素、列表排序、逆序列表等操作。 1、遍历列表 遍历列表通常采用for循环的方式以及for循环和enumerate()函数搭配的方式去实现。 1&#xff…

如何使用raw socket发送UDP报文

前面写的一篇《Linux下如何在数据链路层接收原始数据包》举了一个实例,使用raw socket接收UDP数据报,但是发送一个数据包比接收要复杂一些,本文以一个实例说明如何使用raw socket发送一个UDP报文。 1. 前言 阅读本文前可以考虑先阅读一下我的另外一篇文章《Linux下如何在数据…

Java 集合基础

文章目录一、集合概念二、ArrayList1. 构造方法和添加方法2. 常用方法三、案例演示1. 存储字符串并遍历2. 存储学生对象并遍历3. 键盘录入学生对象并遍历一、集合概念 编程的时候如果要存储多个数据,使用长度固定的数组存储格式,不一定满足我们的需要&a…

【Linux】环境变量,命令行参数,main函数三个参数保姆教学

目录 ☃️1.奇奇怪怪的现象和孤儿进程 ☃️2.环境变量 ☃️3.深刻理解main函数的前两个参数和命令行参数 ☃️1.奇奇怪怪的现象和孤儿进程 首先回顾一下之前我们学过的fork()创建子进程 fork(void)的返回值有两种 注意fork()头…