本文介绍: 类的加载一个相对复杂过程,涉及查找读取解析数据,并在 JVM 内部创建相应的表示。这个过程是整个类生命周期中最初的阶段,为后续的链接初始化阶段奠定基础。由于 JVM 规范对类加载器的实现没有严格限制,因此不同的 JVM 实现不同的类加载可能在具体实现上有所差异。链接阶段是类加载过程的重要组成部分,它确保了类或接口正确整合到 JVM 的内部结构中。通过验证准备解析这三个子阶段,JVM 确保了代码安全性和稳定性,同时为后续的初始化阶段做好准备

基本概念

Java加载过程是 Java 虚拟机(JVM)运行 Java 程序时的重要组成部分。这个过程主要包括以下几个阶段:

  1. 加载(Loading:

  2. 链接(Linking:

  3. 初始化(Initialization:

  4. 使用(Using):

  5. 卸载(Unloading:

这个过程是 Java 程序运行的基础,确保了 Java 程序可以不同环境下以相同的方式执行,同时也支持了 Java 强大的动态性能

加载(Loading)阶段

Java 类加载(Loading)阶段是 Java 类加载过程中的第一阶段,其主要任务是将类的二进制数据不同数据源转换为方法区内的数据结构,并在堆中创建一个 java.lang.Class 对象封装这些数据结构。这一阶段的详细过程如下

1. 类的定位

2. 类的读取

3. 解析内部结构

4. 创建 java.lang.Class 对象

5. 链接到其他类和接口

6. 安全检查

总结

类的加载是一个相对复杂的过程,涉及查找、读取、解析类数据,并在 JVM 内部创建相应的表示。这个过程是整个类生命周期中最初的阶段,为后续的链接、初始化等阶段奠定基础。由于 JVM 规范对类加载器的实现没有严格限制,因此不同的 JVM 实现不同的类加载器可能在具体实现上有所差异。

链接(Linking)阶段

Java 类加载过程中的链接(Linking)阶段紧随类的加载(Loading)阶段,主要负责将已加载的类或接口的二进制数据合并到 Java 虚拟机运行状态中。链接阶段包括三个子阶段:验证(Verification)、准备(Preparation)和解析(Resolution)。这些阶段确保了加载的类在逻辑正确,且与 JVM 的内存结构兼容

1. 验证(Verification

验证是确保加载的类或接口遵循 Java 虚拟机规范,并且不会对 JVM 的安全造成威胁的过程。

2. 准备(Preparation)

准备阶段负责类中的静态变量分配内存,并设置类变量的初始默认值

3. 解析(Resolution

解析阶段是将类、接口、字段和方法的符号引用转换为直接引用的过程。

总结

链接阶段是类加载过程的重要组成部分,它确保了类或接口被正确地整合到 JVM 的内部结构中。通过验证、准备和解析这三个子阶段,JVM 确保了代码安全性和稳定性,同时为后续的初始化阶段做好准备。这个过程对于保持 Java 应用的健壮性和跨平台功能至关重要不同的 JVM 实现可能在细节上有所差异,但大体流程是一致的。

初始化(Initialization)阶段

Java 类的初始化(Initialization)阶段是类加载过程的一个重要环节。在此阶段,Java 虚拟机(JVM)负责执行构造<clinit>() 方法,该方法由编译器自动合成用于初始化类变量和执行静态代码块。以下是初始化阶段的详细介绍

1. 触发条件

类的初始化阶段会在满足以下任一条件时触发

2. <clinit>() 方法

3. 初始化过程

4. 特殊情况

  • 接口初始化:当一个接口中定义了静态字段(final 且 static),且这个字段被用到时,会触发该接口的初始化。
  • 未被使用的类:如果一个类没有被使用,那么它可能永远不会被初始化。

5. 错误处理

总结

初始化阶段是类加载过程的关键部分,负责执行类构造<clinit>() 方法,以初始化类变量和执行静态代码块。JVM 通过精确控制同步,确保类在多线程环境安全地进行初始化。初始化阶段是类生命周期中非常重要的一环,它为类的后续使用做好了准备。

使用(Using)和卸载(Unloading

在 Java 类加载的生命周期中,使用(Using)和卸载(Unloading)是最后两个阶段。它们标志着类在 Java 虚拟机(JVM)中的活跃使用和最终的回收

使用(Using)

在类被加载、链接、初始化之后,它就处于可使用状态。这个阶段,类的功能可以被完全利用,具体包括:

  1. 创建实例:可以通过 new 关键字创建类的实例
  2. 访问静态成员:可以访问类的静态方法和静态字段。
  3. 反射操作:可以通过反射机制查询信息访问成员、调用方法等。
  4. 实现接口:如果类实现了某个接口,可以通过这个接口引用它的实例
  5. 继承:可以被其他类继承,除非它是一个 final 类。

这个阶段中,类是完全活跃的,可以被应用程序自由使用。

卸载(Unloading

卸载是类生命周期的最终阶段。在这个阶段,类由 JVM 从内存中移除。类的卸载发生在以下情况:

  1. 类加载器的实例回收:如果一个类的类加载器的实例被垃圾回收回收,那么由该类加载器加载的所有类也会被卸载。
  2. 类的实例和 Class 对象无引用:如果一个类没有任何活跃的实例,且其 java.lang.Class 对象也没有在任何地方被引用,那么 JVM 可以选择卸载这个类。
  3. 卸载的条件:Java 规范并没有强制要求 JVM 必须卸载类,也没有规定具体的卸载时间点。因此,不同的 JVM 实现可能有不同的卸载策略

卸载后,类的二进制数据和在方法区中的所有结构都会被回收,释放出相应的内存空间

注意点

总结来说,使用阶段是类在 JVM 中的活跃期,此时类的各项功能都可被利用。卸载阶段是类生命周期的终结,此时类及其相关资源被回收,但在实际应用中类的卸载并不频繁。这两个阶段标志着类在 JVM 中的生命周期的完整性。

原文地址:https://blog.csdn.net/weixin_43844521/article/details/134679762

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_28668.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注