类加载过程

来源:互联网 发布:ubuntu 虚拟终端 编辑:程序博客网 时间:2024/06/03 12:43

五部分:加载、验证、准备、解析、初始化

1.加载

加载是类加载的第一个阶段,在加载阶段主要完成以下三件事情:

  • 通过类的全限定名来获取定义此类的二进制字节流。
  • 将这个字节流代表的静态存储结构转化为方法去的运行时数据结构
  • 内存中生成代表该类的Class对象,作为方法区这个类的各种数据的访问入口

注意:对于HotSpot虚拟机而言,Class对象存储在方法区中,而不是堆中

2.验证

根据class文件格式规范验证字节流是否符合规范,确保该字节流不会危害虚拟机。

3.准备

正式为类变量分配内存并设置类变量初始值的阶段,这些变量使用的内存都将在方法区中进行分配,这个阶段中分配的仅仅包括类变量(被static修饰的变量),不包括实例变量。实例变量跟随对象分配在堆中。例如

static int value = 123;

准备阶段过后,value值为0,而不是123。因为此时尚未开始执行任何JAVA方法,value赋值为123的指令存放于类构造器< clinit>中,而类构造器的调用在初始化阶段才会开始。

4.解析

JVM将常量池内的符号引用替换为直接引用的过程。

符号引用:字面量表示目标的形式。

直接引用:直接指向目标的指针、偏移量或句柄等。

5.初始化

初始化阶段是执行类构造器方法的过程。类构造器方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的。

由类加载的过程分析,静态语句块中只能访问定义在它之前的变量,定义在之后的变量,可以赋值(在初始化阶段进行,在准备阶段就已经存在该类变量了,因此可以赋值),但是不能访问。

0 0
原创粉丝点击