类加载过程详解

通过Java命令执行代码的大体流程如下

 

 整个类的加载如图所示

 

 加载

加载,是指Java虚拟机查找字符流(查找.class文件),并且根据字符流创建Java,lang.Class对象的过程,将类的.class文件的二进制数据读入内存,放在运行区域的方法区内,然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。

类加载阶段:

1、Java虚拟机将.class文件读入内存,并为之创建一个class对象。

2、任何类被使用时系统都会为其创建一个且仅有一个的Class对象。

3、这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些改造方法,都有那些成员方法,都有那些成员变量等。

验证

验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害。如果验证失败就会抛出一个java.lang.VerifyError异常或其子类异常,验证过程分为四个阶段。

文件格式验证:验证字符流文件是否符合Class文件格式的规范,并且能被当前虚拟机正确的处理

元数据验证:是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言的规范要求。

字节码验证:主要是进行数据流和控制流的分析,保证被校验类的方法在允许时不会危害虚拟机。

符号引用验证:符号引用验证发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在解析阶段中发生。

准备

准备阶段为变量分配内存并设置变量的初始化。在这个阶段分配的仅为类的变量(static修饰的变量),而不包括类的实例变量。对已非final的变量,JVM会将其设置零值,而不是其赋值语句的值:private static int size = 12。那么在这个阶段,size的值为0,而不是12。但final修饰的类变量将会赋值成真实的值。

解析

解析过程是将常量池内的符号引用替换成直接引用,主要包括四种类型引用的解析。类或接口的解析、字段解析、方法解析、接口方法解析。

初始化

初始化,则是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。

如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。

如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

posted @   起眠  阅读(612)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示