JVM——类加载过程

类加载的过程可以分为5个阶段,分别是加载、验证、准备、解析、初始化。
在这里插入图片描述

加载

加载阶段,开发人员可以使用系统自带的类加载器或者自定义加载器来完成加载,主要任务就是将 Java 类对应的字节码文件加载到内存中,并且生成类的Class对象,流程如下:

  • 根据全限定名获取该类的二进制字节流。
  • 将字节流所代表的静态存储结构转换为方法区的运行时数据结构。
  • 在堆中生成一个该类的Class对象,作为方法区数据的访问入口。

要注意的是,类加载器并不需要在某个类被第一次使用的时候才加载,而是可以在预料到某个类将被使用的时候就去预先加载,如果预先加载出现错误,那么当使用这个类的时候才会报错,不会提前触发报错。

验证

验证的目的是确保Class文件中字节流符合JVM规范和安全约束,主要包含以下四个阶段的校验。

  • 文件格式验证:验证字节码文件的格式是否符合规范。
  • 元数据验证:验证字节码中类的全名、方法信息、字段信息和继承关系是否满足条件。
  • 字节码验证:验证程序语义是否合法。
  • 符号引用验证:验证类使用的其它的类、其他的方法和字段是否存在,权限是否足够。

准备

静态变量分配内存并设置为初始化值,有以下几点需要注意:

  • 这个阶段仅仅是给静态变量(static)分配内存,而不包括实例变量,实例变量会在对象实例化阶段和对象一起在堆中分配内存。
  • 初始值是指数据类型默认的零值,比如0、false、null。

解析

将方法区运行时常量池中的符号引用替换为直接引用。符号引用就是一组符号来描述目标,直接引用就是指向对象的指针。

初始化

初始化阶段会为静态变量设置初值。对静态变量设置初值的方式有两种,分别是直接赋予以及通过静态代码块赋予初值。需要注意的是,只有在类被主动使用的时候才会执行初始化阶段,初始化触发条件有以下几种:

  • 访问某个类的静态变量,或者对静态变量赋值。
  • 调用类的静态方法。
  • 通过new的方式创建类的实例。
  • 通过反射获取该类的Class对象。
  • 初始化某个类的子类,会触发对父类的初始化。
  • 被标记为启动类的类在JVM启动时会触发初始化。

总之,只要碰一个类的对象、方法、变量、Class对象均会触发类的初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿灰90

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值