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

news2024/11/16 4:51:05
  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,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()去掉会怎么样呢?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想找一个没有中间商的账户,很简单,昂首资本推给你

各位投资者都知道,交易的成本决定我们是否盈利,那么有没有一个没有中间商的账户呢?当然有了,昂首资本这就推给你。 在交易的时候,银行为投资者提供兑换业务,并从中收取费用。至于经纪商,它是交…

爬虫requests+综合练习详解

Day2 - 1.requests第一血_哔哩哔哩_bilibili requests作用:模拟浏览器发请求 requests流程:指定url -> 发起请求 -> 获取响应数据 -> 持续化存储 爬取搜狗首页的页面数据 import requests# 指定url url https://sogou.com # 发起请求 resp…

GPS位置虚拟软件 AnyGo mac激活版

AnyGo for Mac是一款一键将iPhone的GPS位置更改为任何位置的强大软件!使用AnyGo在其iOS或Android设备上改变其GPS位置,并在任何想要的地方显示自己的位置。这对那些需要测试应用程序、游戏或其他依赖于地理位置信息的应用程序的开发人员来说非常有用&…

idea远程服务调试

1. 配置idea远程服务调试 这里以 idea 新 ui 为例,首先点击上面的 debug 旁边的三个小圆点,然后在弹出的框框中选择 “Edit”,如下图所示。 然后进入到打开的界面后,点击左上角的 “” 进行添加,找到 “Remote JVM De…

Java 面向对象 04 构造方法(黑马)

这是以前没有赋值的时候,在()里面是空的: 代码: 左边的是调用的空参构造,但是右边没有写空参构造,并不会报错,因为虚拟机会自己给外面一个空参构造的方法,就是这样的&am…

详谈c++智能指针!!!

文章目录 前言一、智能指针的发展历史1.C 98/03 的尝试——std::auto_ptr2.std::unique_ptr3.std::shared_ptr4.std::weak_ptr5.智能指针的大小6.智能指针使用注意事项 二、智能指针的模拟实现三、C11和boost中智能指针的关系 前言 C/C 语言最为人所诟病的特性之一就是存在内存…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS数据文件读取

《SPSS统计学基础与实证研究应用精解》4.3 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解4.3节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。本书旨在手把手教会使…

码农维权——案例分析之违法解除劳动合同(一)

目录 一、背景 二、举证责任方:需要公司举证 三、员工可以自证没有严重违反公司规章制度吗? 四、公司解除劳动合同的程序合法吗? 五、写在最后 一、背景 当前互联网行业普遍以”变相裁员“为目的,公司采用各种手段”逼迫“员…

<信息安全>《1 国内主要企业网络安全公司概览(一)》

1 深信服科技股份有限公司 信息内容LOGO成立日期2000年12月25日成立。总部深圳市南山区学苑大道1001号南山智园A1栋是否上市深信服[300454]A股市值265亿主要产品企业级网络安全云计算IT基础设施数据通信物联网员工规模9000人分支机构全球50多个荣誉国家级高新技术企业、中国软…

Python基础第七篇(Python的文件操作)

文章目录 一、文件编码二、文件的读取操作1.操作代码2.读出结果 三、文件的写出操作1.源代码2.读出结果 四、文件的追加操作1.源代码2.读出结果 这篇文章旨在深入浅出地介绍Python在文件操作上的能力,包括文件的编码、读取和写入等基本操作。内容丰富、易于理解&…

Macos flatter(用于快速LLL)本地编译安装(解决安装过程各种疑难杂症)

flatter是一个开源项目,能大大提高LLL的速度,项目提供的安装文档适用于Ubuntu,但是在macos上安装,总会遇到各种各样的问题,这里记录下所踩坑,帮助大家快速在macos上安装flatter。 文章目录 1.安装依赖库&am…

Unity学习-逐帧图集动画制作

首先在文件部分创建一个Sprite Library Asset 然后点击创建出来的文件 点下面的加号添加对应的图 添加完成之后点一下Apply 然后新建一个物体 添加这三个组件 其中SpriteLibrary里面 把你刚刚创建的图集文件拉过来 Sprite Resolver选择对应的动作和图片 然后开始制作动画 An…

Vue前端环境搭建以及项目搭建

安装node.js 安装node.js主要是为了安装npm工具,用于管理js包等,类似于java的maven。 去官网下载安装。 配置新的镜像源 npm config set registry https://registry.npmmirror.com安装webpack webpack是前端项目打包工具。 命令: npm…

5. 函数调用过程汇编分析

函数调用约定 __cdecl 调用方式 __stdcall 调用方式 __fastcall 调用方式 函数调用栈帧分析 补充说明 不同的编译器实现不一样,上述情况只是VC6.0的编译实现即便是在同一个编译器,开启优化和关闭优化也不一样即便是同一个编译器同一种模式,3…

基于SpringBoot的在线问卷调查管理系统

基于SpringBoot的在线问卷调查管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台主页 问卷列表 问卷详情 管理员界面 摘要 基于Spring Boot的在线问卷调…

数据结构·顺序表应用

本节应用是要用顺序表实现一个通讯录,收录联系人的姓名、性别、电话号码、住址、年龄 ​​​​​​​ 顺序表的实现在上一节中已经完成了,本节的任务其实就是应用上节写出来的代码的那些接口函数功能,做出来一个好看的,可…

判断线程/任务是否全部执行完成

判断线程/任务是否全部执行完成 需求 从网络上下载多个文件(可能会有很多)。最后将所有文件打包为一个压缩包。 思路 考虑可能有很多文件,所以采用多线程,一个线程去下载一个资源。最后再将所有文件夹进行打包。 问题 打包后发现…

vue3自定义按钮点击变颜色实现(多选功能)

实现效果图&#xff1a; 默认选中第一个按钮&#xff0c;未选中按钮为粉色&#xff0c;点击时颜色变为红色 利用动态类名&#xff0c;当定义isChange数值和下标index相同时&#xff0c;赋予act类名&#xff0c;实现变色效果 <template><div class"page"&…

logstack 日志技术栈-04-opensource 开源工具 SigNoz+Graylog

3. SigNoz SigNoz 是一个日志收集和分析工具&#xff0c;可以收集和管理来自各种来源的日志、指标、跟踪和异常。 它为使用 OpenTelemetry 检测应用程序提供本机支持&#xff0c;以防止供应商锁定&#xff0c;将收集到的数据存储在 ClickHouse 中&#xff0c;然后在用户友好的…

OR36 链表的回文结构

目录 一、思路 二、代码 一、思路 找到中间节点 后半部分逆置链表 定义两个指针&#xff0c;一个从头开始出发 一个从中间位置开始出发 但是注意&#xff1a;链表个数可能是奇数或者偶数&#xff0c;需要注意中间节点的计算 二、代码 struct ListNode* reverseList(str…