讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中JVM类加载机制的双亲委派模型及如何打破它面试题

冬杰姑娘_5088

冬杰姑娘_5088

发布时间:2026-08-14 10:42:24

|

924人浏览过

|

来源于php中文网

原创

双亲委派模型是JVM默认的安全加载策略,非强制铁律;其核心是类加载器收到请求时先向上委派父加载器尝试加载,直至Bootstrap ClassLoader,仅当所有上级均无法加载时才由当前加载器执行加载。

java中jvm类加载机制的双亲委派模型及如何打破它面试题

双亲委派模型不是“必须遵守的铁律”,而是JVM默认采用的安全加载策略。它核心作用是防止核心类被篡改、避免类重复加载,但实际开发中很多场景恰恰需要绕过它——面试官问“如何打破”,重点不是背概念,而是说清为什么破、在哪破、怎么破。

双亲委派模型到底在委派什么?

当一个类加载器收到加载请求时,它不会立刻自己找.class文件,而是先把请求“往上递”:先让父加载器尝试;父不行,再让祖父加载器尝试;直到Bootstrap ClassLoader。只有所有上级都找不到,当前加载器才真正动手加载。

  • Bootstrap ClassLoader:加载$JAVA_HOME/lib下的核心类(如java.lang.Object),由C++实现,无Java对象对应
  • Platform ClassLoader(原Extension):加载$JAVA_HOME/lib/ext或-Djava.ext.dirs指定路径的扩展类
  • Application ClassLoader:加载CLASSPATH环境变量指定路径的类,也就是我们写的代码和第三方jar
  • 自定义ClassLoader:继承ClassLoader,可控制加载逻辑,是打破委派的关键出口

为什么要打破双亲委派?四个典型场景

不是为了炫技,而是现实需求倒逼机制调整:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • Web应用隔离(如Tomcat):每个Web应用(war包)都有自己的WEB-INF/lib和WEB-INF/classes。若严格委派,所有应用共用AppClassLoader,就会互相污染、版本冲突。Tomcat为每个应用创建独立的WebAppClassLoader,并优先自己加载,找不到再委派——本质是“反向委派”
  • 热部署与动态加载:Spring Boot DevTools、OSGi插件、IDE调试时替换class文件,都需要卸载旧类、加载新类。而Bootstrap/AppClassLoader不支持卸载,必须用自定义加载器,在loadClass()里跳过super.loadClass()调用,直接走findClass()
  • SPI机制(如JDBC驱动):java.sql.Driver接口由Bootstrap加载,但MySQL驱动com.mysql.cj.jdbc.Driver在应用jar里,Bootstrap根本看不到。JDK用ServiceLoader配合线程上下文类加载器(TCCL):把AppClassLoader设为当前线程TCCL,让Bootstrap层代码能通过Thread.currentThread().getContextClassLoader()拿到子加载器去加载实现类
  • 多版本库共存(微服务/插件系统):A模块依赖Spring 5,B模块依赖Spring 6。统一委派只会加载其中一个版本。解决方案是为每个模块分配独立ClassLoader,彼此隔离,互不干扰

怎么安全地打破它?两种主流方式

关键不是删代码,而是有意识地重写加载流程:

立即学习“Java免费学习笔记(深入)”;

  • 重写loadClass(String, boolean)方法:这是最直接的方式。标准做法是注释掉或跳过super.loadClass()调用,改为先调用findClass()尝试本地加载;失败后再按需委派(比如只对特定包名跳过委派)
  • 利用线程上下文类加载器(TCCL):不改动类加载器本身,而是在关键执行点(如JDBC DriverManager初始化时)主动设置TCCL为应用类加载器。框架内部通过Thread.currentThread().getContextClassLoader()获取并使用它——这是一种“委托穿透”,比重写更轻量、更解耦

面试时容易踩的坑

别只说“重写loadClass就能破”,要体现深度:

  • 误以为“打破=完全不用父加载器”:多数场景仍需部分委派(如加载java.*类必须交给Bootstrap,否则会报错)
  • 忽略类卸载前提:只有自定义ClassLoader加载的类,在无引用后才可能被GC;Bootstrap/AppClassLoader加载的类几乎永不卸载
  • 混淆findClass()和defineClass():前者负责定位字节码(如读文件、解密、网络下载),后者才是真正把字节码转成Class对象的“临门一脚”
  • 没提安全风险:随意打破委派可能导致java.lang.String被恶意替换,所以生产环境必须做白名单校验或签名验证

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

9537

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

6702

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

5932

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1044

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

868

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1236

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2509

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

19851

2023.08.03

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

20

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn