【面试题精讲】JVM-类的生命周期

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址

全网最细面试题手册,支持艾宾浩斯记忆法


1. 什么是 JVM-类的生命周期?

Java 虚拟机(JVM) 是运行所有 Java 程序的抽象计算机。一个 Java 程序运行在 JVM 中,可以使用 Java 编程语言编写的应用软件以及工具进行解读和执行。

在运行 Java 程序时,JVM 将会经历一系列的过程,包括类的加载(动态链接)、初始化和卸载这些过程,这些过程共同构成了类的生命周期

在类的生命周期中,JVM 采用了一个被称为类加载器(ClassLoader) 的机制来动态加载 Java 类。当一个 Java 程序开始运行的时候,会首先加载需要的系统类,然后再根据程序需要,动态加载其他用户定义的类和接口,加载的过程是由类加载器完成的。

这个生命周期包括以下 7 个阶段:

  1. 加载: 通过类的完全限定查找此类字节码文件,并利用字节码文件创建一个类的定义,并放入方法区内,这个过程需要类加载器完成。
  2. 连接:
    • 验证: 确保被加载的类的正确性。
    • 准备: 给类的静态变量分配并初始化默认值。
    • 解析: 把类的二进制数据中的符号引用替换为直接引用。
  3. 初始化: 对类的静态变量(如 public static int value=123),以及静态代码块(如 static{})进行初始化。
  4. 使用: 当类被加载后就可以被使用了。
  5. 卸载: 使用完毕,类被卸载,并且卸载的类所使用的内存空间予以回收。

2. 为什么需要 JVM-类的生命周期?

理解 JVM-类的生命周期的重要性体现在以下几个方面:

  • 代码的正确性 : 在类的加载和初始化阶段,JVM 通过验证和准备确保的类文件符合 JVM 的规范,无代码逻辑问题等,否则会抛出异常。这些操作可以确保 Java 的稳定性和安全性。
  • 内存的管理 : 了解类的生命周期有助于我们理解 Java 内存结构,优化内存,防止内存溢出,以及更好的进行性能调优。
  • 代码的运行效率 : JVM 的类加载优化能力对代码执行效率影响巨大,例如类的缓存机制,减少类的加载时间,提高代码的运行效率。

3. JVM-类的生命周期的实现原理?

如前所述,JVM-类的生命周期主要包括加载、验证、准备、解析、初始化、使用、卸载这七个阶段。我们来具体地了解其实现原理。

  • 加载: 在类加载的阶段,JVM 需要完成以下三个主要任务:
    1. 通过类的全名获取定义此类的二进制字节流
    2. 将这个字节流代表的静态存储结构转化为方法区的运行时数据结构
    3. 在内存中生成一个代表这个类的java.lang.Class对象,像是字节码等类数据的访问接口

具体实现示例省略 500 字,详情参考 Java 虚拟机规范或相关书籍。

  • 验证: 验证的目的是为了确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,保证安全。其中的步骤包括文件格式验证,元数据验证,字节码验证,符号引用验证等。

具体实现示例省略 500 字,详情参考 Java 虚拟机规范或相关书籍。

  • 准备: 准备阶段是为类变量(也就是 static 修饰的变量)分配内存,并且初始化默认值。注意这里说的是默认值,不是程序中我们设置的初始化值。

具体实现示例省略 500 字,详情参考 Java 虚拟机规范或相关书籍。

  • 解析: 解析阶段是将编译期获得的类、接口、字段和方法的符号引用,替换为直接引用的过程。

具体实现示例省略 500 字,详情参考 Java 虚拟机规范或相关书籍。

  • **初始化:**初始化阶段就是执行类构造器方法的过程。()方法派生自编译期收集的所有类变量的赋值动作和静态语句块。

具体实现示例省略 500 字,详情参考 Java 虚拟机规范或相关书籍。

  • 使用和卸载:在 JVM 的生命周期中,当一个类经过加载、验证、准备、解析、初始化后,它就可以被引用,也就是被使用了。当一个类不再被其他对象引用时,JVM 会将其卸载,释放它占用的内存空间。

具体实现示例省略 500 字,详情参考 Java 虚拟机规范或相关书籍。

4. JVM-类的生命周期的使用示例

由于类的生命周期并不是我们可以直接使用的类库,因此在这里我们无法提供具体的代码示例。但是我们可以通过一段简单的代码示例来了解类的生命周期。

java 复制代码
public class Example {
    static {
        System.out.println("This is static block, it will be executed when class is loaded.");
    }

    public Example() {
        System.out.println("This is constructor, it will be executed when new an instance.");
    }

    public static void main(String[] args) {
        new Example();
    }
}

在运行上述代码的时候,我们可以清楚的看到类加载、初始化、使用的过程。当类加载的时候静态代码块会被执行,当新建一个实例的时候,构造函数会被执行。这就是类的生命周期在代码中的体现。而卸载这个阶段,我们无法从代码中直接看出,只有在 JVM 的垃圖区中,当类不再被引用的时候,才会被卸载。

5. JVM-类的生命周期的优点

JVM-类的生命周期模型具有以下优点:

  • 稳定性和安全性 :类的生命周期流程严格遵守 Java 语言规范,保证了代码执行的稳定性和安全性。
  • 内存管理和效率 :JVM 动态加载和卸载类,优化内存,提高执行效率。
  • 可插拔性 :JVM 中的加载器采用双亲委派模式,支持自定义类加载器,增强了 Java 的可插拔性。
  • 跨平台性 :JVM 封装了底层操作系统的细节,保证 Java 的跨平台性。

6. JVM-类的生命周期的缺点

JVM-类的生命周期本身没有特别的缺点,但是关于 JVM-类加载机制有时候可能会存在一些问题:

  • 类加载冲突 :不同的类加载器可能会加载同一个类,导致在使用 instanceof 或 cast 等操作时出现问题。
  • 类加载过程可能被破坏 :有些代码可能会通过反射或其他方式,破坏类的加载过程。

7. JVM-类的生命周期的使用注意事项

  • 理解类加载机制 :理解 JVM-类加载机制是非常重要的,这不仅可以帮助我们编写更高效的代码,也能让我们在解决一些复杂的问题时,拥有更多有效的工具。
  • 正确使用类变量和静态初始化块 :了解它们在类的生命周期中被初始化和使用的时机。
  • 注意类的生命周期相关问题 :譬如类加载冲突,以及类初始化顺序。

8. 总结

JVM-类的生命周期是非常核心和基础的知识点,对于每一个 Java 开发者来说,理解这个过程都是非常必要的。这不仅可以帮助我们深入理解 Java 语言的实现机制,也能让我们在编写代码时,更加了解其背后的运行原理。

本文由mdnice多平台发布

相关推荐
安的列斯凯奇18 分钟前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
架构文摘JGWZ1 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC1 小时前
Swift语言的网络编程
开发语言·后端·golang
邓熙榆1 小时前
Haskell语言的正则表达式
开发语言·后端·golang
专职4 小时前
spring boot中实现手动分页
java·spring boot·后端
Ciderw4 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·
m0_748246355 小时前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
m0_748230445 小时前
创建一个Spring Boot项目
java·spring boot·后端
卿着飞翔5 小时前
Java面试题2025-Mysql
java·spring boot·后端
C++小厨神5 小时前
C#语言的学习路线
开发语言·后端·golang