瑞_JVM虚拟机_类的生命周期

🙊前言:本文章为瑞_系列专栏之《JVM虚拟机》的类的生命周期篇,本篇章主要介绍类的加载阶段、连接阶段、初始化阶段、使用阶段以及卸载阶段。由于博主是从B站黑马程序员的《JVM虚拟机》学习其相关知识,所以本系列专栏主要是针对该课程进行笔记总结和拓展,文中的部分原理及图解等也是来源于黑马提供的资料,特此注明。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!

瑞&3l

1 JVM虚拟机概述

瑞:请参考《瑞_JVM虚拟机_概述》




2 类的生命周期

  类的生命周期描述了一个类加载、使用、卸载的整个过程

  类的生命周期一般分为五个阶段:加载 ➡️ 连接 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

在这里插入图片描述

瑞:初始化阶段最重要,因为程序员可以干涉

  由于连接阶段操作很多,所以,又可以分为七个阶段:加载 ➡️ 验证 ➡️ 准备 ➡️ 解析 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

在这里插入图片描述




2.1 加载阶段

  加载 ➡️ 连接 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

瑞:一句话概括:类加载器将类的信息加载到内存中,Java虚拟机在方法区(InstanceKlass)和堆区(java.lang.Class)中各分配一个对象去保存类的信息,程序员一般用到的是java.lang.Class

2.1.1 加载过程

  1️⃣ 加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。

  程序员可以使用Java代码拓展的不同的渠道

在这里插入图片描述

  2️⃣ 类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。

瑞:注意和3️⃣区分,此处2️⃣的方法区是虚拟概念,方法区是Java虚拟机的规范的一部分,它是一个虚拟的概念,代表的是JVM内存中的一个区域,用于存储类的结构信息,例如运行时常量池、字段和方法数据、构造函数和普通方法的字节码等。在不同的JVM实现中,方法区可能有不同的物理表现。例如,在Oracle HotSpot JVM中,方法区在Java 8之前通常由被称为永久代(PermGen space)的内存区域实现,而在Java 8及以后的版本中,它被元空间(Metaspace)所替代。

在这里插入图片描述

  3️⃣ 类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的【方法区】中。

  生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息

在这里插入图片描述

瑞:注意区分InstanceKlassClass

InstanceKlass 是 JVM 内部的一个数据结构,用于存储和管理Java类的元数据信息(如方法表、接口表、字段表等)InstanceKlass是Klass模型的一部分,主要用于JVM内部操作。

Class 是一个 Java 类,它代表 Java 类在运行时的动态类型信息。每个加载到 JVM 中的 Java 类都有一个对应的 Class 对象,用于提供关于类的类型信息的反射访问。

  4️⃣ 同时,Java虚拟机还会在【堆】中生成一份与方法区中数据类似的java.lang.Class对象。

  作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8及之后)

在这里插入图片描述

  • 对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中所有信息。

  这样Java虚拟机就能很好地控制开发者访问数据的范围

在这里插入图片描述

2.1.2 查看内存中的对象(hsdb工具)

  推荐使用 JDK 自带的 hsdb 工具查看Java虚拟机内存信息。工具位于JDK安装目录下lib文件夹中的sa-jdi.jar

  启动命令:java -cp sa-jdi.jar sun.jvm.hotspot.HSDB(要进入到jdk中的lib目录)


hsdb 工具演示案例

  1️⃣ Hsdb工具测试类

import java.io.IOException;

/**
 * Hsdb 测试类
 *
 * @author LiaoYuXing-Ray
 **/
public class HsdbDemo {
    public static final int i = 486;
    public static void main(String[] args) throws IOException {
        HsdbDemo hsdbDemo = new HsdbDemo();
        System.in.read(); // 为了测试,不让程序终止
    }
}

  2️⃣ 运行步骤1 的代码后,打开cmd(管理员权限)窗口,输入jps命令查看进程的pid(博主的PID为49068,HsdbDemo为Java进程的类名)。进入jdk中的lib目录,执行java -cp sa-jdi.jar sun.jvm.hotspot.HSDB命令打开hsdb工具。

在这里插入图片描述

  3️⃣ 选择 File 的 Attach to HosPort Process 选项,输入PID

在这里插入图片描述
  4️⃣ 选择 Tools 中的 Object Histogram 选项

在这里插入图片描述

  5️⃣ 找到 HsdbDemo 对象

在这里插入图片描述
  6️⃣ 可以查看 HsdbDemo 的方法区的 InstaceKlass 以及堆中的 Class 对象以及静态变量的相关信息。

在这里插入图片描述

瑞:一句话概括:类加载器将类的信息加载到内存中,Java虚拟机在方法区(InstanceKlass)和堆区(java.lang.Class)中各分配一个对象去保存类的信息,程序员一般用到的是java.lang.Class




2.2 连接阶段

  加载 ➡️ 连接 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

  后续内容在尽快更新中…

2.2.1 验证

  加载 ➡️ 验证 ➡️ 准备 ➡️ 解析 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

2.2.2 准备(final特殊)

  加载 ➡️ 验证 ➡️ 准备 ➡️ 解析 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

2.2.3 解析

  加载 ➡️ 验证 ➡️ 准备 ➡️ 解析 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

  

2.3 初始化阶段<client> ★★★

  加载 ➡️ 连接 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

  




2.4 使用阶段

  加载 ➡️ 连接 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

  




2.5 卸载阶段

  加载 ➡️ 连接 ➡️ 初始化 ➡️ 使用 ➡️ 卸载

  




附:JDK1.8运行时数据区

在这里插入图片描述




本文是博主的粗浅理解,可能存在一些错误或不完善之处,如有遗漏或错误欢迎各位补充,谢谢

  如果觉得这篇文章对您有所帮助的话,请动动小手点波关注💗,你的点赞👍收藏⭐️转发🔗评论📝都是对博主最好的支持~


相关推荐

  1. JVM生命周期

    2024-03-10 14:46:01       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 14:46:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 14:46:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 14:46:01       82 阅读
  4. Python语言-面向对象

    2024-03-10 14:46:01       91 阅读

热门阅读

  1. 类复习【C#】

    2024-03-10 14:46:01       46 阅读
  2. Python语言例题集(008)

    2024-03-10 14:46:01       43 阅读
  3. 【Go】令牌桶限流算法

    2024-03-10 14:46:01       40 阅读
  4. TensorFlow 量化投资分析

    2024-03-10 14:46:01       40 阅读
  5. 力扣题库第6题:三数之和

    2024-03-10 14:46:01       49 阅读
  6. PCB板材原材料覆铜板的生产工艺与主要作用总结

    2024-03-10 14:46:01       48 阅读