Java类的加载过程
JVM类的加载过程分为五个部分:加载、验证、准备、解析、初始化。
1. 加载
加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)。
具体步骤:
- JVM将class文件读入到内存当中,创建一个Class对象。
- 任何类被使用时系统都会为其创建一个且仅有一个Class对象。
- 这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。
2. 验证
这一阶段的主要目的是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
主要分为四个阶段验证:
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
3. 准备
准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。若类变量为常量,即被final修饰,则直接赋值。
4. 解析
解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。
5. 初始化
初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由JVM主导。到了初始阶段,才开始真正执行类中定义的Java程序代码。
初始化阶段是执行类构造器方法的过程。方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成的。虚拟机会保证方法执行之前,父类的方法已经执行完毕。