Java 类生命周期与类加载机制
目录
类的生命周期
类的生命周期描述了一个类从加载、使用到卸载的完整过程(7个阶段)
1. 加载阶段(Loading)
加载过程
- 类加载器通过全限定名,从三种渠道获取字节码:
- 本地文件系统
- 网络资源
- 类加载器通过全限定名,从三种渠道获取字节码:
- 动态生成(如动态代理)
内存分配
内存区域 存储内容 作用特性 方法区 InstanceKlass 对象 类元信息存储 堆内存 java.lang.Class 对象 Java层类信息访问入口 开发工具
# 使用HSDB查看内存对象 java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
2. 连接阶段(Linking)
① 验证(Verification)
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
② 准备(Preparation)
- 为静态变量分配内存
- 设置默认初始值(如 int->0, boolean->false)
③ 解析(Resolution)
- 符号引用转直接引用
- 分为静态解析与动态解析
3. 初始化阶段()
- 执行类构造器代码(静态变量赋值、静态代码块)
- 父类优先初始化原则
- 线程安全保证(同步锁)
类加载器机制
类加载器架构
类加载器类型
加载器类型 | 加载路径 | 实现语言 |
---|---|---|
启动类加载器 | $JAVA_HOME/lib | C++ |
扩展类加载器 | $JAVA_HOME/lib/ext | Java |
应用程序类加载器 | classpath | Java |
自定义类加载器 | 自定义路径 | Java |
双亲委派机制
机制优点
✅ 避免核心类篡改
✅ 防止重复加载
✅ 实现资源隔离(如Tomcat容器)
打破双亲委派场景
- SPI机制(DriverManager)
- OSGi热部署
- 自定义类加载器重写loadClass
JVM类全生命周期流程图
类卸载条件
查看类加载路径
// 打印当前线程上下文类加载器路径
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL[] urls = ((URLClassLoader)loader).getURLs();
System.out.println(Arrays.toString(urls));
自定义类加载器模板
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) {
// 实现类文件加载逻辑
}
}