Java中类(class)的加载过程

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() 方法的过程,此方法是编译器收集类中所有类变量(静态变量)和静态代码块中的语句,然后进行合并产生的。


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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值