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/,同名类只认第一个找到的,后面的直接丢弃。

相关推荐
点心的游戏开发世界4 小时前
GDScript 入门笔记(十一):Lambda 与匿名函数
开发语言·笔记·游戏引擎·godot
摇滚侠4 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32
spring boot·笔记·后端
phltxy4 小时前
C语言操作符详解
java·c语言·算法
步行cgn5 小时前
@Configuration 详解:Spring 配置类的核心注解
java·后端·spring
sunshine22 girl5 小时前
Java学习一 环境配置2 安装和基本使用Idea
java·学习·intellij-idea
鱼子星_6 小时前
【C++】继承和多态(上)
c++·笔记
xian_wwq6 小时前
【学习笔记】深度认知系列-第14讲 端侧AI崛起——为什么AI正在从云端走向本地
人工智能·笔记·学习
嘿嘿-667 小时前
Windows 一键使用 GPT-6 Astra:Codex CLI 配置教程
java·人工智能·windows·gpt·chatgpt·web
策案案案8 小时前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea
辰烨chenye9 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode