1.加载  2.验证,3.准备,4.解析(这三个阶段称之为连接,连接阶段负责把类的二进制数据合并到JRE中) 5.初始化

加载:加载阶段是类加载过程的第一个阶段。在这个阶段,JVM 的主要目的是将字节码(.class文件)从各个位置(网络、磁盘等)转化为二进制字节流加载到内存中,接着会为这个类在 JVM 的方法区创建一个对应的 Class 对象,这个 Class 对象就是这个类各种数据的访问入口。(通俗点说:把代码数据加载到内存中

验证:确保加载的类信息(.class)符合JVM规范,无安全方面的问题。

准备:为类的静态域(static修饰的,主要就是类成员变量)分配内存,并设置初始值。

(Java 中的变量有「类变量」和「类成员变量」两种类型,「类变量」指的是被 static 修饰的变量,而其他所有类型的变量都属于「类成员变量」。在准备阶段,JVM 只会为「类变量」分配内存,而不会为「类成员变量」分配内存。「类成员变量」的内存分配需要等到初始化阶段才开始。)

解析:将类的二进制数据中的符号引用替换成其在内存中的直接引用。(了解下就行)

初始化(重点):该阶段主要是对静态Field进行初始化      

在Java类中对静态Field指定初始值有两种方式:

  1. 声明时即指定初始值,如static int a = 5;

  2. 使用静态代码块为静态Field指定初始值,如:static{    b = 5;    } 

初始化类的步骤:

  1. 假如这个类还没有被加载和连接,则程序先加载并连接该类。
  2. 假如该类的直接父类还没有被初始化,则先初始化其直接父类。
  3. 假如类中有初始化语句,则系统依次执行这些初始化语句。(所以JVM总是最先初始化java.lang.Object类。)

类初始化的时机(什么时候初始化类)

1.创建类的实例时(new对象)

2.初始化某个类的子类时,此时该子类的所有父类都会被初始化

3.调用某个类的静态方法时

4.使用某个类或接口的静态域或对该域赋值时

(还有两个,不常见就不写了)

08-29 07:04