文章目录
- 1 JVM虚拟机概述
- 2 类的生命周期
- 2.1 加载阶段
- 2.1.1 加载过程
- 2.1.2 查看内存中的对象(hsdb工具)
- 2.2 连接阶段
- 2.2.1 验证
- 2.2.2 准备(final特殊)
- 2.2.3 解析
- 2.3 初始化阶段\<client> ★★★
- 2.4 使用阶段
- 2.5 卸载阶段
- 附:JDK1.8运行时数据区
🙊前言:本文章为瑞_系列专栏之《JVM虚拟机》的类的生命周期篇,本篇章主要介绍类的加载阶段、连接阶段、初始化阶段、使用阶段以及卸载阶段。由于博主是从B站黑马程序员的《JVM虚拟机》学习其相关知识,所以本系列专栏主要是针对该课程进行笔记总结和拓展,文中的部分原理及图解等也是来源于黑马提供的资料,特此注明。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!
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对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息
瑞:注意区分
InstanceKlass
和Class
。
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目录)
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运行时数据区
如果觉得这篇文章对您有所帮助的话,请动动小手点波关注💗,你的点赞👍收藏⭐️转发🔗评论📝都是对博主最好的支持~