Tomcat /hvm类加载机制

Tomcat 类加载机制

JVM 类加载器层级

JVM 有三层内置类加载器,自上而下

复制代码
Bootstrap ClassLoader     ← 加载 JDK 核心类 (rt.jar)
    └── Extension ClassLoader  ← 加载 JDK 扩展类
            └── Application ClassLoader  ← 加载应用 classpath

加载规则是双亲委派:子加载器收到请求先交给父加载器,父加载器找不到才自己加载。目的是防止用户代码替换掉 JDK 核心类。


Tomcat 打破了双亲委派

Tomcat 为了支持多个 WebApp 互相隔离,自己实现了一套类加载器:

复制代码
Bootstrap ClassLoader
    └── Extension ClassLoader
            └── Application ClassLoader (Tomcat自身)
                    └── WebApp ClassLoader  ← 每个应用独立一个

WebApp ClassLoader 故意反转了加载顺序,优先自己加载,而不是先交给父加载器。这样不同 WebApp 的同名类互不干扰。


WebApp ClassLoader 内部加载顺序

在单个 WebApp 内部,顺序是固定的:

复制代码
1. /WEB-INF/classes/   ← 优先
2. /WEB-INF/lib/*.jar  ← 其次
3. 父ClassLoader(Tomcat公共类)

classes/ 永远比 lib/ 先搜索,所以同名类 classes 里的赢


为什么这样设计

本质是 classpath 的线性搜索------JVM 找类就像找文件,按路径顺序找到第一个匹配的就用,同名类只加载一次,后面的直接忽略

这个特性被广泛利用:

场景 做法
热补丁 把修复后的 class 放到 classpath 靠前的位置
框架扩展 在 classes 里放同名类覆盖 jar 里的默认实现
单元测试 用 Mock 类替换真实实现

一句话总结

Tomcat 的 WebApp ClassLoader 主动打破双亲委派,让 classes/ 优先于 lib/,同名类只认第一个找到的,后面的直接丢弃。

相关推荐
程序员清风22 分钟前
专业再升级!程序员专属显示器明基RD280UG上手实测!
java·后端·面试
Lam Tang2 小时前
APS 系列文章 08
java·代理模式
Fa_Mian_Tuan2 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
萧瑟余晖3 小时前
Java深入解析篇三十三之消息队列
java·开发语言
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
IT爱学堂3 小时前
尚硅谷Java+AI大模型应用开发革新版本 2025年3月
java·开发语言·人工智能
不爱编程的小九九4 小时前
小九源码-springboot004-springboot智能阅读推荐系统
java·spring boot·后端
FakeOccupational4 小时前
【电路笔记 STM32】stm32f103 实现HAL_UART_Transmit_DMA + 普通模式/连续模式的 UART DMA 收发
笔记·stm32·嵌入式硬件
SCandL1524 小时前
Docker的实战应用
java·docker·容器
AC赳赳老秦4 小时前
OpenClaw 多源采集公开行业数据:从原始信息到研究报告初稿的自动化实践
java·c语言·c++·python·php·deepseek·openclaw