Java类加载器(ClassLoader)知识点总结
概述
本文档是对Java类加载器(ClassLoader)相关视频的知识点总结,重点介绍Java类加载机制、双亲委派模型以及使用Arthas工具分析类加载问题的方法。
类加载器基础知识
什么是类加载器(ClassLoader)
类加载器负责将Class文件(字节码)加载到内存中,转为JVM能够识别的Class对象。Java程序运行时,并不是一次性将所有类加载到内存,而是按需加载。
Java默认提供的三种类加载器
-
Bootstrap ClassLoader(启动类加载器)
- 负责加载JDK核心类库,如
java.lang.*
,java.util.*
等rt.jar中的类 - 由C/C++实现,在Java中无法直接引用,表现为null
- 代码示例见
BootstrapClassLoaderDemo.java
- 负责加载JDK核心类库,如
-
Extension ClassLoader(扩展类加载器)
- 负责加载JDK扩展目录(
$JAVA_HOME/jre/lib/ext
)中的类库 - 代码示例见
ExtClassLoaderDemo.java
- 负责加载JDK扩展目录(
-
Application ClassLoader(应用程序类加载器)
- 负责加载classpath路径下的类库,包括用户自定义类和Maven依赖
- 也称为System ClassLoader(系统类加载器)
- 代码示例见
AppClassLoaderDemo.java
双亲委派模型(Parents Delegation Model)
基本原理
当一个类加载器收到类加载请求时,它首先不会自己尝试加载这个类,而是委派给父类加载器去完成。只有当父类加载器无法找到这个类时(在其搜索范围内找不到该类),子类加载器才会尝试自己加载。
委派流程
- AppClassLoader收到加载请求
- 将请求委派给ExtClassLoader
- ExtClassLoader将请求委派给BootstrapClassLoader
- BootstrapClassLoader尝试加载,如果找不到类
- 则ExtClassLoader尝试加载,如果找不到类
- 最后由AppClassLoader尝试加载
双亲委派的优点
- 安全性:防止核心API被篡改,例如无法自定义
java.lang.String
类 - 避免重复加载:父加载器已加载的类,子加载器不会再次加载
使用Arthas工具分析类加载问题
Arthas简介
Arthas是阿里巴巴开源的Java诊断工具,它可以帮助开发人员分析生产环境中的各种问题,包括类加载问题。
常用命令
-
sc命令:查看已加载的类信息
sc -d 全类名 # 查看类的详细信息
-
classloader命令:查看类加载器
classloader -t # 查看类加载器层次关系 classloader -l # 列出所有类加载器
-
trace命令:跟踪方法调用
trace 类名 方法名 # 跟踪方法执行过程
实际案例
项目中的AppClassLoaderDemo.java
演示了如何查看不同类的类加载器:
- 自定义的
Student
类由AppClassLoader加载 - Maven依赖中的
FileUtils
类也由AppClassLoader加载
破坏双亲委派模型
在一些特殊场景下,需要自定义类加载器来破坏双亲委派模型:
- SPI机制(Service Provider Interface):如JDBC、日志框架等
- 热部署/热加载:如在Tomcat中,不同应用使用各自的类加载器
- OSGI:动态模块化系统,每个Bundle有自己的类加载器
总结
类加载器是Java虚拟机的重要组成部分,它将Java程序的字节码动态加载到内存中。理解类加载器的工作原理和双亲委派模型对于解决类加载相关问题、防止类加载安全漏洞具有重要意义。通过Arthas等工具,我们可以更便捷地分析和解决类加载问题。
觉得有用的话可以点点赞 (/ω\),支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。