jvm 从 class 文件加载数据到内存,并对数据进行 校验、转换解析 和 初始化,最终形成可被 jvm 直接使用的 java 类型。
一、类的生命周期:
加载、连接(验证,准备,解析)、初始化、使用、卸载。
1.加载
类的全限定名、类的二进制字节流转为方法区的运行时数据结构、方法区实例化一个java.lang.Class对象作为访问入口。
2.验证
保证 Class 文件中的内容符合当前 jvm 的要求,且对 jvm 来讲是安全的。
·文件格式验证
·元数据验证 语义分析,是否符合 java 语言规范
·字节码验证 保证类的方法在运行时不会危害 jvm
·符号引用验证 发生在 jvm 将符号引用转为直接引用时,对类自身以外的信息进行匹配性校验,确保解析能正常执行
3.准备
在方法区为 类变量(static修饰)分配内存,并设置初始值。
4.解析
将常量池内的符号引用 替换为 直接引用。包括:类或接口、字段、类方法、接口方法解析。
5.初始化
准备阶段的初始化是初始为系统值,本阶段初始化为程序员计划的值。
二、类加载器
通过一个类的全限定名获取类的二进制字节流 这个动作的实现 称为类加载器,在 jvm 外部实现。
1.类加载器类型
·启动类加载器 jvm的一部分
·扩展类加载器
·应用程序类加载器(系统类加载器)
2.双亲委派模型
bootstrap CL <= extension CL <= application CL <= user CL
类加载器之间的父子关系不以继承实现,而以组合关系来复用父加载器的代码。
工作过程:CL 收到类加载请求,首先把请求委派给父类加载器去完成,因此所有加载请求都会传送给顶层的启动类加载器,只有父类加载器反馈不能完成这个加载请求,子类才会自己去加载。
优点:java 类随着它的 CL 具备了一种层次关系,能够保证在各种 CL 环境中类的一致性。