说说类的生命周期吗?类的生命周期是怎么样的?

2 个回答

  • 楚云飞
    用顺其自然态度过随遇而安的生活.
    ### **类的生命周期** 一个类从加载到卸载,生命周期可以分为以下几个阶段: ### **1. 加载阶段** 将类的 `.class` 文件加载到内存中,并生成对应的 `java.lang.Class` 对象。 #### **1.1 加载过程** - 查找并读取类的二进制数据(从文件系统、网络或运行时生成)。 - 将类的二进制数据放入 **方法区**。 - 创建对应的 `Class` 对象,供程序使用。 ### **2. 链接阶段** 对类的二进制数据进行验证和准备,包括以下步骤: #### **2.1 验证** - 确保类文件符合 JVM 的规范,防止恶意代码导致虚拟机崩溃。 #### **2.2 准备** - 为类的静态变量分配内存,并初始化为默认值(如 `int` 为 0,`boolean` 为 `false`)。 #### **2.3 解析** - 将常量池中的符号引用替换为直接引用(如方法和字段的内存地址)。 ### **3. 初始化阶段** - 执行类的 `<clinit>` 方法: - 静态变量的显式初始化。 - 静态代码块的执行。 ### **4. 使用阶段** 类被加载完成后,可以被使用: - 创建对象实例(`new` 关键字)。 - 调用类的静态方法。 - 通过反射获取类的元数据。 ### **5. 卸载阶段** 类满足以下条件时会被卸载: 1. 所有该类的实例都已被 GC 回收。 2. 加载该类的 `ClassLoader` 已被 GC 回收。 类在 **Full GC** 期间从方法区中被清理。 ### **6. 适用于特定场景的类卸载** - JVM 的基础类加载器不会被回收,因此 JDK 自带的基础类永远不会被卸载。 - 自定义类加载器加载的类可能被卸载,例如: - **Tomcat** 中的 Web 应用。 - **SPI(Service Provider Interface)** 加载的服务类。 - **JSP 编译生成的类** 等短生命周期的类。 这些类在需求结束后会被频繁回收。 ### **总结** 类的生命周期主要分为 **加载、链接、初始化、使用和卸载** 五个阶段。只有在满足条件时,自定义类加载器加载的类才会被卸载,保证了内存的合理使用和程序的灵活性。
    发布于 2024-07-16 02:47 •IP属地 广东
    举报
    评论
    收藏

  • 彩鳞
    快乐出现的时候,就好好享受快乐。
    ### 类的生命周期 类的生命周期包括以下几个部分:加载、连接、初始化、使用和卸载。前面三个部分是类的加载过程。具体如下: #### 1. 加载(Loading) - **描述**:查找并加载类的二进制数据,在 Java 堆中创建一个 `java.lang.Class` 类的对象。 - **步骤**: - 根据类的全限定名查找对应的 .class 文件。 - 读取 .class 文件的二进制数据。 - 创建 `Class` 对象,将二进制数据存储在 `Class` 对象中。 #### 2. 连接(Linking) 连接包括以下三个步骤: 1. **验证(Verification)** - **描述**:确保被加载的类文件符合 JVM 的要求,保证程序运行的安全性。 - **步骤**: - 文件格式验证:检查文件格式是否符合规范。 - 元数据验证:检查类中的元数据是否符合 Java 语言规范。 - 字节码验证:分析字节码,确保不会危害虚拟机。 - 符号引用验证:检查符号引用是否能被解析。 2. **准备(Preparation)** - **描述**:为类的静态变量分配内存,并将其初始化为默认值。 - **步骤**: - 分配内存:为静态变量分配内存空间。 - 默认值初始化:将静态变量初始化为默认值(如 0、null)。 3. **解析(Resolution)** - **描述**:将类中的符号引用转换为直接引用。 - **步骤**: - 符号引用:是一组符号来描述所引用的目标。 - 直接引用:是一种直接指向目标的引用,如内存地址或偏移量。 #### 3. 初始化(Initialization) - **描述**:为类的静态变量赋予正确的初始值。 - **步骤**: - 执行类中的静态初始化块。 - 将静态变量赋值为程序员指定的初始值。 #### 4. 使用(Using) - **描述**:在程序中创建对象并使用类的实例。 - **步骤**: - 通过 new 关键字或反射机制创建类的实例。 - 调用类的属性和方法。 #### 5. 卸载(Unloading) - **描述**:类不再被使用,JVM 执行垃圾回收。 - **步骤**: - 当没有对类的任何引用时,类的 Class 对象将被垃圾回收。 - 释放类加载器加载的类的内存空间。 通过上述五个部分,JVM 完整地管理类的生命周期,从类的加载到使用,再到类的卸载,确保程序的正常运行和内存的有效利用。
    发布于 2024-07-06 21:13 •IP属地 陕西
    举报
    评论
    收藏1