JVM系列-3.类的生命周期

  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家
  • 📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2023计划中:源码溯源,一探究竟
  • 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀

文章目录

  • 类的生命周期
    • 生命周期概述
    • 加载阶段
      • 类的生命周期 加载阶段 – 查看内存中的对象
    • 连接阶段
      • 类的生命周期 连接阶段之验证
        • 验证案例-版本号的检测
      • 类的生命周期 连接阶段之准备
      • 类的生命周期 连接阶段之解析
    • 类的生命周期 初始化阶段
      • 经典面试题

类的生命周期

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

在这里插入图片描述

生命周期概述

在这里插入图片描述

类的卸载会在垃圾回收篇讲解

如果比较细致的区分,会分成七个阶段。

在这里插入图片描述

加载阶段

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

在这里插入图片描述

**程序员可以使用Java代码拓展的不同的渠道。**比如有些公司可能需要将类保存到数据库里面去进行持久化,那么就可以在这一步进行处理。

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

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

在这里插入图片描述

4、同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8及之后)。

在这里插入图片描述

在这里插入图片描述

JDK8以前静态字段是存在于方法区的。

对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中所有信息。这样Java虚拟机就能很好地控制开发者访问数据的范围。

在这里插入图片描述

上面的InstanceKlass是使用C++去编写的对象,而Java代码一般不能去直接操作C++编写的对象,所以Java虚拟机在堆上创建了一个Java.Lang.Class这种用Java包装后的对象,可以让我们在代码中获取到。并且Java.Lang.Class所包含的要少于方法区中所包含的字段。比如虚方法表。

类的生命周期 加载阶段 – 查看内存中的对象

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

在这里插入图片描述

启动命令:java -cp sa-jdi.jar sun.jvm.hotspot.HSDB

这段代码就是我们要监控的程序

在这里插入图片描述

通过jps找到对应项目的进程号,然后使用HSDB连接到这个程序

所以我们就需要再HSDB中去找到HsdbDemo对象

在这里插入图片描述

在这里插入图片描述

连接阶段

在这里插入图片描述

类的生命周期 连接阶段之验证

连接(Linking)阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规范》中的约束。这个阶段一般不需要程序员参与。

主要包含如下四部分,具体详见《Java虚拟机规范》:

1.文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。

在这里插入图片描述

2.元信息验证,例如类必须有父类(super不能为空)。

在这里插入图片描述

3.验证程序执行指令的语义,比如方法内的指令执行中跳转到不正确的位置。

在这里插入图片描述

4.符号引用验证,例如是否访问了其他类中private的方法等。

验证案例-版本号的检测

在这里插入图片描述

类的生命周期 连接阶段之准备

准备阶段为静态变量(static)分配内存并设置初始值。

在这里插入图片描述

准备阶段只会给静态变量赋初始值,而每一种基本数据类型和引用数据类型都有其初始值。

在这里插入图片描述

final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。

在这里插入图片描述

类的生命周期 连接阶段之解析

解析阶段主要是将常量池中的符号引用替换为直接引用。

符号引用就是在字节码文件中使用编号来访问常量池中的内容。

在这里插入图片描述

直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。

在这里插入图片描述

类的生命周期 初始化阶段

在这里插入图片描述

准备阶段为静态变量(static)分配内存并设置初始值。但是最终value值不应该是1吗?

初始化阶段会执行静态代码块中的代码,并为静态变量赋值。

初始化阶段会执行字节码文件中clinit部分的字节码指令。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上面的案例将两句话对调顺序,结果会怎么样呢?

在这里插入图片描述

以下几种方式会导致类的初始化:

1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。

2.调用Class.forName(String className)。

3.new一个该类的对象时。

4.执行Main方法的当前类。

经典面试题

在这里插入图片描述

在这里插入图片描述

{
	System.out.println("C")
}
这段代码块最终会被放到构造方法中去

clinit指令在特定情况下不会出现,比如:如下几种情况是不会进行初始化指令执行的。

1.无静态代码块且无静态变量赋值语句。

2.有静态变量的声明,但是没有赋值语句。

3.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化。


直接访问父类的静态变量,不会触发子类的初始化。

子类的初始化clinit调用之前,会先调用父类的clinit初始化方法。

在这里插入图片描述

如果把new B02()去掉会怎么样呢?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Kotlin协程的JVM实现源码分析(下)

协程 根据 是否保存切换 调用栈 ,分为: 有栈协程(stackful coroutine)无栈协程(stackless coroutine) 在代码上的区别是:是否可在普通函数里调用,并暂停其执行。 Kotlin协程&…

NG+WAF实现应用安全访问

一、基本概念 什么是waf? Web应用防火墙(waf)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,WAF是一种工作在应用层的、通过特定的安全策略来专门为Web应用提供安全防护的产品。 什么是ngx_lua_…

2024年开年的荣誉--来自国产数据库

上周在北京参加了阿里云的开发者大会,我因为去年做了一点小贡献。非常荣幸的获得了阿里云的MVP的这个殊荣。(期间也认识了一些大神级的人物)还有就是一些网上认识的打卡们线下见面。 这个也是我一直追求的荣誉。 几乎在同时P(Ping…

单机zk--数据恢复,处理客户端接入,两种超期机制,处理客户端请求,客户端主动断开

1.概述 zk是一个分布式内存数据库。既然是数据库,就需要处理客户端发送过来的读,写请求。随着请求执行,不断更改数据实体。 作为内存数据库,数据实体全部加载到内存,在内存修改。我们把客户端发来的请求叫做事务&…

SpringCloud之OpenFeign的学习、快速上手

1、什么是OpenFeign OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装,在微服务中的服务调用发送网络请求起到了重要的作用,简化了开发,可以让我们跟写接口一样调其他服务。 并且OpenFeign内置了Ribbon实现负载均衡。 官方文档…

【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

代码随想录二刷 | 回溯 | 组合优化

代码随想录二刷 &#xff5c; 回溯 &#xff5c; 组合优化 剪枝优化 剪枝优化 在遍历的过程中有如下代码&#xff1a; for (int i startIndex; i < n; i) {path.pop_back();backtracking(n, k, i 1);path.pop_back(); }n 4&#xff0c;k 4的话&#xff0c;那么第一层f…

SQL注入实战:盲注

盲注&#xff1a; 1、当攻击者利用SQL注入漏洞进行攻击时&#xff0c;有时候web应用程序会显示&#xff0c;后端数据库执行SQL查询返回的错误信息&#xff0c;这些信息能帮助进行SQL注入&#xff0c;但更多时候&#xff0c;数据库没有输出数据web页面&#xff0c;这是攻击者会…

flutter 实现定时滚动的公告栏的两种不错方式

相同的部分 自定义一个类继承StatefulWidget 所有公告信息存放在list里 第一种 scrollControllerAnimatedContainer 逻辑如下 我们可以发现启动了一个timer计时器计时5秒&#xff0c;hasClients检查其目标对象&#xff08;我们用的是listview&#xff09;是否被渲染&#x…

文件重命名技巧:如何使用编号快速高效地重命名大量文件的方法

在处理大量文件时&#xff0c;我们经常需要对其进行重命名&#xff0c;以便更好地组织和管理。然而&#xff0c;手动重命名每个文件既耗时又容易出错。为了解决这个问题&#xff0c;我们可以利用一些简单的编号技巧来快速高效地重命名大量文件。下面将介绍一种简单而实用的方法…

【好文翻译】JavaScript 中的 realm 是什么?

本文由体验技术团队黄琦同学翻译。 原文链接&#xff1a; https://weizmangal.com/2022/10/28/what-is-a-realm-in-js/ github仓库地址&#xff1a; https://github.com/weizman/weizman.github.io/blob/gh-pages/_posts/2020-02-02-what-is-a-realm-in-js.md 前言 作为我对…

前端安全相关

请求后端接口必须带上sign 以上主要是解决&#xff1a;除了数据泄露外&#xff0c;一些重要功能的接口如果没有做好保护措施也会被恶意调用造成DDoS、条件竞争等攻击效果 一些营销活动类的Web页面&#xff0c;领红包、领券、投票、抽奖等活动方式很常见。此类活动对于普通用户…

LOSS损失函数值是什么意思?

环境&#xff1a; Bert-VITS2-v2.3 问题描述&#xff1a; LOSS损失函数值是什么意思&#xff1f; 解决方案&#xff1a; 在机器学习和深度学习中&#xff0c;损失函数&#xff08;Loss Function&#xff09;用来衡量模型预测值与实际值之间的差异或误差。LOSS损失函数值是…

Kaggle之旅3

Kaggle之旅3 文章目录 Kaggle之旅3前言一、Predict survival on the Titanic and get familiar with ML basics二、开始1.基础知识构造随机森林的4个步骤 2.结合教程继续 总结 前言 今天继续Kaggle之旅&#xff0c;尝试Titanic - Machine Learning from Disaster 一、Predict…

java eazyexcel 实现excel的动态多级联动下拉列表(1)使用名称管理器+INDIRECT函数

原理 将数据源放到一个新建的隐藏的sheet中将选项的子选项的对应字典设置到名称管理器中&#xff08;名称是当前选项的内容&#xff0c;值是他对应的子菜单的单元格范围&#xff0c;在1里面的sheet中&#xff09;子菜单的数据根据INDIRECT函数去左边那个单元格获取内容&#x…

如何实现 H5 秒开?

我在简历上写了精通 H5&#xff0c;结果面试官上来就问&#xff1a; 同学&#xff0c;你说你精通 H5 &#xff0c;那你能不能说一下怎么实现 H5 秒 由于没怎么做过性能优化&#xff0c;我只能凭着印象&#xff0c;断断续续地罗列了几点&#xff1a; 网络优化&#xff1a;http2、…

5G_射频测试_测试模式解读(三)

Downlink test models FR1 test model 1.1 (NR-FR1-TM1.1)&#xff08;满PRB&#xff0c;QPSK&#xff09;FR1 test model 1.2 (NR-FR1-TM1.2)( QPSK/boosted/40% QPSK)FR1 test model 2 (NR-FR1-TM2)(64QAM 只有1个PRB 功率最低)FR1 test model 2a (NR-FR1-TM2a) )(256QAM 只…

最小二乘平面拟合(高斯牛顿法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;最小二乘平面拟合 背景 ptb认证 ptb是对几何体拟合算法的认证。 主要涉及3D直线&#xff0c;3D圆&#xff0c;平面&#xff0c;球&#xff0c…

零食折扣店,注定昙花一现?

年终岁末&#xff0c;又到了各类休闲零食产品一年一度的销售旺季。与过去不同的是&#xff0c;近年来的休闲零食赛道正因大量零食折扣店的涌现而显得热闹非凡。 随着主打折扣、低价的零食折扣店成为消费者特别是三四线下沉市场消费者的新宠&#xff0c;资本开始涌入并快速推动…