问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

JVM类加载的过程详解

创作时间:
作者:
@小白创作中心

JVM类加载的过程详解

引用
1
来源
1.
http://www.cdweb.net/article/cgicsd.html

JVM类加载的过程主要包括加载、验证、准备、解析和初始化五个阶段。下面将详细介绍每个阶段的具体步骤:

1. 加载

在加载阶段,JVM主要完成以下三件事:

  1. 通过一个类的全限定名来获取该类的二进制字节流
  2. 将这个字节流的静态存储结构转化为方法区运行时数据结构
  3. 在内存堆中生成一个代表该类的java.lang.Class对象,作为该类数据的访问入口

2. 验证

验证、准备、解析这三步可以看做是一个连接的过程,将类的字节码连接到JVM的运行状态之中。验证的主要目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会威胁到JVM的安全。验证主要包括以下几个方面的验证:

  1. 文件格式的验证:验证字节流是否符合Class文件的规范,是否能被当前版本的虚拟机处理
  2. 元数据验证:对字节码描述的信息进行语义分析,确保符合Java语言规范
  3. 字节码验证:通过数据流和控制流分析,确定语义是合法的,符合逻辑的
  4. 符号引用验证:这个校验在解析阶段发生

3. 准备

准备阶段为类的静态变量分配内存,初始化为系统的初始值。对于final static修饰的变量,直接赋值为用户的定义值。例如:

public static int a = 7;

在准备阶段过后的初始值为0,而不是7。

4. 解析

解析阶段将常量池内的符号引用转为直接引用(如物理内存地址指针)。

5. 初始化

初始化阶段是真正开始执行类中定义的Java代码的阶段。具体来说:

  1. 初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。
  2. 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
  3. 虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号