ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

类加载过程详解

2022-05-10 23:00:32  阅读:139  来源: 互联网

标签:初始化 变量 验证 虚拟机 详解 解析 过程 Class 加载


通过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修饰的变量或语句块进行初始化。

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

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

标签:初始化,变量,验证,虚拟机,详解,解析,过程,Class,加载
来源: https://www.cnblogs.com/ouyangPH/p/16255831.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有