类加载过程
虚拟机将 .class
加载入内存,运行时进行
- 加载
- 读取
.class
数据,转化成 方法区的数据结构 - 生成一个
java.lang.Class
对象 ,作为该数据的访问入口
- 读取
- 验证
- 文件格式验证:验证字节流是否符合Class文件格式的规范。
- 元数据验证:要符合Java语言规范
- 字节码验证:类的方法体 的校验分析
- 符号引用验证:发生在解析阶段
- 准备 静态变量赋值
- static 变量 内存分配
- static 变量 设置初始值
- 初始值是 变量数据类型的默认值
- final 修饰成常量时 初始值为 被赋予的值
- 解析
- 符号引用转换为直接引用
- 符号引用:编译期间的内存具体位置的占位符
- 直接引用:直接或间接指向目标内存位置
- 引用的类型未加载初始化:触发这个引用对应类型的加载和初始化
- 符号引用转换为直接引用
- 初始化 主动资源初始化
- static变量 会赋予实际代码赋予的值
- static代码块 会执行里面的代码
方法区中,使用同一加载器的情况下,每个类只会有一份Class字节流信息
Java堆中,使用同一加载器的情况下,每个类只会有一份 java.lang.Class 类的对象
类加载器
启动类加载器(Bootstrap Class Loader)
拓展类加载器(Extension Class Loader)
应用程序类加载器(Application Class Loader)