JVM笔记2 -- 类加载机制
2018-11-10·Java, JVM, ClassLoader
类加载过程
加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载
加载
- 通过全限定名获取二进制字节流
- 将静态存储结构转化为方法区运行时数据结构
- 在堆中生成 Class 对象作为访问入口
验证
确保类的正确性:文件格式验证 → 元数据验证 → 字节码验证 → 符号引用验证
准备
为静态变量分配内存并初始化为默认值。但 final static 变量在准备阶段就被初始化为指定值。
解析
将符号引用转换为直接引用。符号引用包括:类/接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符。
初始化
为静态变量赋予正确的初始值。两种方式:
- 声明时指定初始值
- 静态代码块
初始化时机(主动使用才会触发):
- new 创建实例
- 访问或赋值静态变量
- 调用静态方法
- 反射(Class.forName)
- 初始化子类时父类先初始化
- 虚拟机启动时的主类
双亲委派机制
Bootstrap ClassLoader
↑
Extension/Platform ClassLoader
↑
Application ClassLoader
↑
Custom ClassLoader
加载时先委托给父加载器,父加载器无法加载时才自己加载。防止核心类被篡改。
结束生命周期
- 执行 System.exit()
- 程序正常结束
- 遇到异常或错误终止
- 操作系统错误导致 JVM 进程终止
#Java#JVM#ClassLoader