JVM类加载的过程详解
创作时间:
作者:
@小白创作中心
JVM类加载的过程详解
引用
1
来源
1.
http://www.cdweb.net/article/cgicsd.html
JVM类加载的过程主要包括加载、验证、准备、解析和初始化五个阶段。下面将详细介绍每个阶段的具体步骤:
1. 加载
在加载阶段,JVM主要完成以下三件事:
- 通过一个类的全限定名来获取该类的二进制字节流
- 将这个字节流的静态存储结构转化为方法区运行时数据结构
- 在内存堆中生成一个代表该类的
java.lang.Class对象,作为该类数据的访问入口
2. 验证
验证、准备、解析这三步可以看做是一个连接的过程,将类的字节码连接到JVM的运行状态之中。验证的主要目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会威胁到JVM的安全。验证主要包括以下几个方面的验证:
- 文件格式的验证:验证字节流是否符合Class文件的规范,是否能被当前版本的虚拟机处理
- 元数据验证:对字节码描述的信息进行语义分析,确保符合Java语言规范
- 字节码验证:通过数据流和控制流分析,确定语义是合法的,符合逻辑的
- 符号引用验证:这个校验在解析阶段发生
3. 准备
准备阶段为类的静态变量分配内存,初始化为系统的初始值。对于final static修饰的变量,直接赋值为用户的定义值。例如:
public static int a = 7;
在准备阶段过后的初始值为0,而不是7。
4. 解析
解析阶段将常量池内的符号引用转为直接引用(如物理内存地址指针)。
5. 初始化
初始化阶段是真正开始执行类中定义的Java代码的阶段。具体来说:
- 初始化阶段是执行类构造器
<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。 - 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
- 虚拟机会保证一个类的
<clinit>()方法在多线程环境中被正确加锁和同步。
热门推荐
英语语法 表示变化的系动词
绿茶、红茶、乌龙茶区别一览,三大茶类品类选购指南
种植牙基台的作用、种类和材料选择指南
中医专家解析:肚子总“咕咕叫”,是肠道在“抗议”?一文读懂肠鸣那些事儿
无氧运动的魅力与科学
种植牙基台意外歪了,到底能不能调整?20年种牙医生揭秘基台调整的可行性
“解密”好莱坞各工种收入
星露谷物语古代玩偶获取攻略:图鉴大全及使用指南
不同厂家奥美拉唑肠溶胶囊质量分析
将来人民币会贬值还是增值?长远趋势影响因素分析
从失败中走向成功的10位名人励志故事
电灯经过了怎样的演化过程?爱迪生为什么能成为“光明之父”?
什么是三皈依
英语学习管理系统的全面解析与应用探索
如何在家制作美味的米酒?
“超强婴儿”来了?基因编辑婴儿引发的争议与思考
Cell:超声可控 「智能」CAR-T 细胞,精准爆破实体瘤来了
深度学习基础:线性代数的本质1——深入理解向量
高中数学向量公式大全 向量解题技巧有哪些
如何精确测量黄金的密度值?这种测量方法有哪些技术要点?
日语学习之日语基础100句常用日语,让你快速学会基本交流
古代中国的动物实验:科学方法的初步探索
长隆野生动物世界游玩攻略,含一日游路线、交通指南、景点和项目介绍
杏仁这个季节可以种吗?
8道家常美食推荐:做法简单易上手,简单几步就能搞定
机遇与挑战并存 中医医院高质量发展路径何在
药食同源之黄精:从传统到现代的多重功效
婴儿咳嗽喉咙有痰怎么办最有效
网络安全领域五大注入攻击类型介绍
黄金价格为何大幅下跌?一文帮你分析原因!