一文浅析Java中类加载过程

学习总结于:《深入了解JAVA虚拟机》-周志明
类加载相关文章索引:
一文弄懂Java中类加载器的关系
Java中双亲委派机制的实现原理
Java中自定义类加载器

Java 类的声明周期

类从被加载到虚拟机内存中开始,直到卸载出内存,整个生命周期分为以下七个阶段:

在这里插入图片描述
类加载过程就是指:加载、验证、准备、解析和初始化这五个阶段

Java 类加载过程

加载

在加载阶段,虚拟机会做以下三件事情:

  1. 通过一个类的全限定名来获取定义此类的二进制流。
  2. 将这个二进制流所代表的的静态储存结构转化成方法区的运行时数据结构。
  3. 在内存中生成这个类的java.lang.class对象(不一定是在堆内存中,HotSpot认为这个Class对象比较特殊,将它放在方法区里面)。

验证

验证阶段的目的是为了确保Class文件的字节流包含的信息,符合JVM的要求,并且不会危害JVM的安全。

准备

准备阶段是正式为类变量 (使用 static 修饰的,又叫 “静态变量”) 进行内存分配和设置初始值的阶段,这些变量使用的内存都在方法区中进行分配。
注意: 这里有一个容易混淆的地方,这时候进行分配的仅仅仅仅仅包括静态变量,就是被 static 修饰的,不会分配实例变量的内存,而实例变量的内存将会随着对象实例化的时候分配在堆内存中。而且这里的初始化通常都是数据类型的零值,比如:

public static int a = 123;

变量 a 在这个阶段的初始值是 0,而不是123!!切记!!

如果是引用数据类型的零值就是 null,如果是 boolean 的零值就是false。
把变量 a 初始化为 123 会在后面 “初始化” 阶段进行。

上面说到通常是零值,那么也有特殊情况。比如:

public static final int a = 123;

如果使用 final修饰,那么在这个准备阶段就会初始化为123。

解析

解析阶段比较复杂,简单来说就是虚拟机将常量池中符号引用转换成直接引用的过程。

初始化

初始化阶段是类加载阶段的最后一步。到了这一阶段,虚拟机才真正的执行Java程序代码。这一阶段就是虚拟机执行类构造器 clinit() 方法的过程,此方法是编译器收集类中所有类变量(静态变量)和静态代码块中的语句,然后进行合并产生的。


技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章