JVM 类加载机制

目录

一、 类加载机制

1、加载

2、验证

3、准备

4、解析

4.1、符号引用

4.2、直接引用

5、初始化

二、类构造器


一、 类加载机制

JVM 类加载机制分为五个部分: 加载,验证, 准备, 解析,初始化,下面我们就分别来看一下这 五个过程。

invalid image(图片无法加载)

1、加载

加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对 象 ,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个 Class 文件获取, 这里既 可以从 ZIP 包中读取(比如从 jar 包和 war 包中读取), 也可以在运行时计算生成(动态代理) , 也可以由其它文件生成(比如将 JSP 文件转换成对应的 Class 类) 。

2、验证

这一阶段的主要目的是为了确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并 且不会危害虚拟机自身的安全。

3、准备

准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使 用的内存空间。注意这里所说的初始值概念, 比如一个类变量定义为:

public static int v = 8080;
实际上变量 v 在准备阶段过后的初始值为 0 而不是 8080,将 v 赋值为 8080 的 put static 指令是 程序被编译后, 存放于类构造器方法之中。
但是注意如果声明为:

public static final int v = 8080;
在编译阶段会为 v 生成 ConstantValue 属性, 在准备阶段虚拟机会根据 ConstantValue 属性将 v 赋值为 8080。

4、解析

解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是 class 文件中 的:

  1. CONSTANT_Class_info
  2. CONSTANT_Field_info
  3. CONSTANT_Method_info
    等类型的常量。
4.1、符号引用

符号引用与虚拟机实现的布局无关, 引用的目标并不一定要已经加载到内存中。各种虚拟 机实现的内存布局可以各不相同,但是它们能接受的符号引用必须是一致的,因为符号引 用的字面量形式明确定义在 Java 虚拟机规范的 Class 文件格式中。

4.2、直接引用

直接引用可以是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。如果有 了直接引用,那引用的目标必定已经在内存中存在。

5、初始化

初始化阶段是类加载最后一个阶段, 前面的类加载阶段之后, 除了在加载阶段可以自定义类加载 器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行类中定义的 Java 程序代码。

二、类构造器

初始化阶段是执行类构造器方法的过程。 方法是由编译器自动收集类中的类变 量的赋值操作和静态语句块中的语句合并而成的。虚拟机会保证子方法执行之前, 父类 的方法已经执行完毕 ,如果一个类中没有对静态变量赋值也没有静态语句块, 那么编译 器可以不为这个类生成()方法。

注意以下几种情况不会执行类初始化:

  1. 通过子类引用父类的静态字段, 只会触发父类的初始化, 而不会触发子类的初始化。 2. 定义对象数组, 不会触发该类的初始化。
  2. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类, 不会触 发定义常量所在的类。
  3. 通过类名获取 Class 对象,不会触发类的初始化。
  4. 通过 Class.forName 加载指定类时, 如果指定参数 initialize 为 false 时,也不会触发类初 始化, 其实这个参数是告诉虚拟机, 是否要对类进行初始化。
  5. 通过 ClassLoader 默认的 loadClass 方法, 也不会触发初始化动作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值