【JVM】类的加载过程

类的加载过程分为加载、连接、初始化,而连接过程又分为验证、准备、解析。

加载

在加载过程,完成3件事情:1) 通过全类名获取定义此类的二进制字节流;2) 将字节流代表的静态存储结构转换为方法区的运行时数据结构;3) 在内存中生成代表该类的class对象,作为方法区这些数据的访问入口。
非数组类的加载还可以通过自定义类加载器去控制字节流的获取方式(重写一个类加载器的loadClass()方法),数组类型不通过类加载器创建,而是JVM直接创建。

验证

包括验证class文件的魔数、版本号、符号引用合法性、是否继承了final类、是否实现了抽象类或接口中的抽象方法等。

准备

给类变量(static修饰)分配内存并设置初始值,在方法区中分配。默认会给这些变量赋0值,对于常量则直接将常量值赋给它。
注意:static final修饰会赋给常量值,只有static修饰即使在程序中赋初始值了,准备阶段后也是0,在初始化阶段才会赋初始值。

解析

将JVM常量池中的符号引用替换为直接引用。
符号引用:以一组符号描述引用目标,符号可以是任何形式的字面量,只要使用时无歧义定位到目标即可。符号引用与JVM实现的内存布局无关,不一定已加载到内存。
直接引用:直接指向目标的指针、相对偏移量或间接定位目标的句柄。与JVM实现内存布局相关,目标必然已存在内存中。

初始化

执行类构造器方法,该方法根据代码中的赋值动作、静态语句块合并产生,对类变量进行初始化。

猜你喜欢

转载自blog.csdn.net/Steven_L_/article/details/106244759