Java 类生命周期与类加载机制
目录
类的生命周期
类的生命周期描述了一个类从加载、使用到卸载的完整过程(7个阶段)

1. 加载阶段(Loading)
-
加载过程
- 类加载器通过全限定名,从三种渠道获取字节码:
- 本地文件系统
- 网络资源
- 类加载器通过全限定名,从三种渠道获取字节码:
- 动态生成(如动态代理)
-
内存分配
内存区域 存储内容 作用特性 方法区 InstanceKlass 对象 类元信息存储 堆内存 java.lang.Class 对象 Java层类信息访问入口 -
开发工具
bash# 使用HSDB查看内存对象 java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
2. 连接阶段(Linking)
① 验证(Verification)
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
② 准备(Preparation)
- 为静态变量分配内存
- 设置默认初始值(如 int->0, boolean->false)
③ 解析(Resolution)
- 符号引用转直接引用
- 分为静态解析与动态解析
3. 初始化阶段()
- 执行类构造器代码(静态变量赋值、静态代码块)
- 父类优先初始化原则
- 线程安全保证(同步锁)
类加载器机制
类加载器架构
启动类加载器
C++ 扩展类加载器 应用程序类加载器 自定义类加载器
类加载器类型
加载器类型 | 加载路径 | 实现语言 |
---|---|---|
启动类加载器 | $JAVA_HOME/lib | C++ |
扩展类加载器 | $JAVA_HOME/lib/ext | Java |
应用程序类加载器 | classpath | Java |
自定义类加载器 | 自定义路径 | Java |
双亲委派机制
应用类加载器 扩展类加载器 启动类加载器 1.委托查询 2.继续向上委派 3.未找到类 4.未找到类 5.自行查找加载 应用类加载器 扩展类加载器 启动类加载器
机制优点
✅ 避免核心类篡改
✅ 防止重复加载
✅ 实现资源隔离(如Tomcat容器)
打破双亲委派场景
- SPI机制(DriverManager)
- OSGi热部署
- 自定义类加载器重写loadClass
JVM类全生命周期流程图
类加载器 JVM GC 类加载阶段 1.Loading(获取二进制流) 2.Linking(验证→准备→解析) 3.Initialization(静态初始化) 类的使用阶段 4.实例化对象(new) 5.访问静态字段/方法 6.运行时方法调用 类卸载阶段 7.GC可达性分析 清理元空间 卸载类信息 保持加载状态 alt [不可达] [仍在使用] 类加载器 JVM GC
类卸载条件
- 堆中无该类的实例
- 对应的Class对象未被引用
- 类加载器实例已被回收
实战技巧
查看类加载路径
java
// 打印当前线程上下文类加载器路径
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL[] urls = ((URLClassLoader)loader).getURLs();
System.out.println(Arrays.toString(urls));
自定义类加载器模板
java
public class CustomClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) {
byte[] data = loadClassData(name);
return defineClass(name, data, 0, data.length);
}
private byte[] loadClassData(String className) {
// 实现类文件加载逻辑
}
}