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

文章目录

    • 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虚拟机》学习其相关知识,所以本系列专栏主要是针对该课程进行笔记总结和拓展,文中的部分原理及图解等也是来源于黑马提供的资料,特此注明。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!

瑞&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运行时数据区

在这里插入图片描述




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

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不愧是华为出来的,太厉害了...

实习去了博彦科技&#xff08;外包&#xff09;&#xff0c;做的就是螺丝钉的活&#xff0c;后面还因为人效不佳&#xff0c;被开了。 正式毕业后去了另外一个做电子发票的公司&#xff0c;但是都是功能测试和一点点APP测试&#xff0c;然后经常被开发怼&#xff0c;测试毫无地…

筛选出等于1的式子

然后统计和归类 归类分行归类方法 算术符号归类 数字大小排序算术符号归类 import randomdef generate_expression(num_range, num_count, operators):nums random.sample(range(num_range[0], num_range[1]1), num_count)ops random.choices(operators, knum_count-1)expre…

考研复试要想顺利通关,务必掌握的一些问题

亲爱的学弟学妹们&#xff0c;大家好&#xff01; 我是研一的学姐&#xff0c;深知考研路上的艰辛与不易。如今&#xff0c;为了回馈广大考研学子&#xff0c;我决定将自己精心整理的考研复试资料拿出来与大家分享&#xff0c;希望能为你们的复试之路添砖加瓦&#xff0c;助你…

JS直接量及其相关对象

什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型&#xff1a;表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后&#xff0c;ES就会自动判断其类型&#xff0c;而且当参数发生变…

vulhub中Weblogic < 10.3.6 ‘wls-wsat‘ XMLDecoder 反序列化漏洞(CVE-2017-10271)复现

Weblogic的WLS Security组件对外提供webservice服务&#xff0c;其中使用了XMLDecoder来解析用户传入的XML数据&#xff0c;在解析的过程中出现反序列化漏洞&#xff0c;导致可执行任意命令。 访问http://your-ip:7001/即可看到一个404页面&#xff0c;说明weblogic已成功启动 …

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面&#xff0c;宽和高分别是&#xff1a;m_nDataWidth m_nDataHeight 给定缩放比例&#xff1a;fXZoom fYZoom&#xff0c;返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即&#xff1a; 根据比…

万用表你用对了吗?小白必读!

1&#xff0c;数字万用表类型 数字万用表分&#xff1a;手持万用表和台式万用表。 2&#xff0c;万用表基本介绍 &#xff08;1&#xff09;选择开关 万用表的选择开关是一个多档位的旋转开关&#xff0c;用来选择测量档位和量程。一般的万用表测量档位包括如下图&#xff1…

macOS上实现「灵动岛」效果

自从Apple iPhone推出了「灵动岛」功能后&#xff0c;用户们就被其优雅的设计和强大的功能所吸引。然而&#xff0c;作为macOS用户&#xff0c;我们一直在等待这一功能能够在我们的设备上实现。现在&#xff0c;随着新的应用程序的推出&#xff0c;我们终于可以在我们的Mac上体…

Java高频面试之Mysql篇

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 请说下你对 MySQL 架构的了解&#xff1f; mysql是一个c/s架构的数据库管理系统, 客户端可以是图形化界面,也可以是命令行或者java等程序 服务端由一下组成部分 连接管理器:管理连接,管理线程,验证身…

Docker的安装及MySQL的部署(CentOS版)

目录 1 前言 2 Docker安装步骤 2.1 卸载可能存在的旧版Docker 2.2 配置Docker的yum库 2.2.1 安装yum工具 2.2.2 配置Docker的yum源 2.3 安装Docker 2.4 启动和校验 2.5 配置镜像加速(使用阿里云) 2.5.1 进入控制台 2.5.2 进入容器镜像服务 2.5.3 获取指令并粘贴到…

leetcode 1143. 最长公共子序列【动态规划】

leetcode 1143. 最长公共子序列 int longestCommonSubsequence(char* text1, char* text2) {int len1 strlen(text1);int len2 strlen(text2);int dp[len1 1][len2 1];memset(dp, 0, sizeof(dp));for (int i 1; i < len1; i) {for (int j 1; j < len2; j) {if (t…

Clock Verification IP

Clock Verification IP IP 参数及接口 IP 例化界面 相关函数 start_clock //产生时钟 <hierarchy_path>.IF.start_clockstop_clock //停止时钟 <hierarchy_path>.IF.stop_clockset_initial_value //设置时钟初始值为 0 <hierarchy_path>IF.set_initia…

基于springboot实现图书推荐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书馆推荐系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0c;比…

【数据结构】用栈实现队列

前言&#xff1a;本节博客分享了用栈实现队列效果的思路以及代码&#xff0c;有需要借鉴即可。 1.题目及链接 LINK 2.思路分析 如果要用栈实现队列&#xff0c;我们直到栈是先入后出的一个效果&#xff0c;所以我们可以用两个栈&#xff0c;这样逆转两次数不就是入栈之前数组…

2023护网蓝初面试

目录 一、渗透测试的流程 二、常见的漏洞 三、中间件漏洞 四、SQL注入原理、种类&#xff1f;防御&#xff1f;预编译原理&#xff0c;宽字节注入原理 预编译原理&#xff1a; 宽字节注入原理&#xff1a; 五、XSS的种类有哪些&#xff1f;区别&#xff1f;修复&#xf…

【每日刷题】栈与队列-LC394、LC347、LC215

题外话&#xff1a;感觉脑子没长到栈这块…最近刷栈的题都好难啊…哭哭…坚持坚持&#xff01;多刷几遍就好了&#xff01;&#xff01; 1. LC394.字符串解码 题目链接 先说数据结构。 维护两个栈&#xff1a;一个栈存之前的字符串&#xff0c;另一个栈存之后的字符串的重复…

深入解析汽车MCU的软件架构

一、背景知识 电动汽车&#xff08;EV&#xff09;正在成为首选的交通方式&#xff0c;为传统内燃机汽车提供了一种可持续发展的环保型替代方案。在电动汽车复杂的生态系统中&#xff0c;众多电子控制单元&#xff08;ECU&#xff09;在确保其高效运行方面发挥着至关重要的作用…

HashSet在添加元素时,是如何判断元素重复的?

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

计算机系统

一、进制的转换 1.进制的表示 二进制&#xff08;B&#xff09;&#xff1a; 0&#xff0c;1&#xff0c;10 八进制&#xff08;O&#xff09;&#xff1a; 0&#xff0c;1&#xff0c;2&#xff0c;7&#xff0c;10&#xff0c;11 十进制&#xff08;D&#xff09;&#xff…

【c++】string模拟实现

string类的接口 namespace zjw {class string{public:typedef char* iterator;typedef const char* const_iterator;private:char* _str;int _size;int _capacity;};这里的迭代器直接使用原生指针来封装。 _str为指向string数组的首地址的指针。 _size为string数组的大小。 …