说一下类的生命周期

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:接下来的三个月里,对梦想的追逐 ");

文章

    • 类的生命周期
      • 加载阶段
      • 连接阶段
        • 验证:验证内容是否满足《Java虚拟机规范》
        • 准备:给静态变量赋初始值
        • 解析:将常量池中的符号引用替换成指向内存的直接引用
      • 初始化阶段
    • 总结回答

类的生命周期

描述了一个类加载、使用、卸载的整个过程
生命周期: 加载、连接、初始化、使用、卸载

  • 连接:验证、准备、解析

加载阶段

  1. 加载阶段:通过类加载器把字节码信息(类的信息)加载到内存中,Java虚拟机在方法区和堆区各保存一个对象
  • 第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。程序员可以使用Java代码拓展的不同的渠道
    • 本地文件:磁盘上的字节码文件
    • 动态代理生成:程序使用动态代理生成
    • 通过网络传输的类:早期的Applet技术使用
  • 类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
    • 生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。

image.png

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

image.png

思考1:为什么需要在方法区和堆区都要创建一个对象?image.png

  • InstanceKlass对象是使用C++编写的对象,Java代码一般不能直接操作
  • 堆区中的Java.lang.Class是使用Java包装后的对象,Java程序员可以获取到
    • 字段是少于InstanceKlass对象的字段的(控制开发者访问数据的范围,保证安全性)

思考2:在类的加载阶段怎么查看内存中的对象?

  • 使用jdk自带的hsdb工具查看Java虚拟机内存信息。工具位于JDK安装目录lib文件夹下的sa-jdi.jar中。
  • 启动命令:java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
  • image.png

image.png

  • jps 是 Java 虚拟机自带的一个小工具,用于列出当前系统上所有正在运行的 Java 进程的主类名和它们各自的 Java 虚拟机参数。可以在命令行中直接运行 jps 命令来查看当前系统上正在运行的 Java 进程列表。

image.png

连接阶段

验证:验证内容是否满足《Java虚拟机规范》
  1. 文件格式验证
    1. 格式是否正确:文件以0xcafebabe开头
    2. 主次版本号是否满足当前Java虚拟机的要求【主版本号不能高于运行环境主版本号;如果主版本号相同,副版本号也不能超过】
  2. 元信息验证
    1. 比如:super不能为空,一定有父类Object
  3. 验证程序执行指令的语义
    1. 比如:方法内的指令执行中跳转到不正确或不存在的位置
  4. 符号引用验证
    1. 比如:是否访问了其他类中private的方法等
准备:给静态变量赋初始值
  • 为静态变量分配内存并设置初始值,每一种基本类型和引用类型都有初始值
数据类型初始值数据类型初始值
int0byte0
long0Lbooleanfalse
short0double0.0
char‘\u0000’引用数据类型null

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

解析:将常量池中的符号引用替换成指向内存的直接引用
  • 符号引用:在字节码文件中使用编号来访问常量池中的内容,并不是直接引用
  • 直接引用:在字节码文件中不再使用编号,而是使用内存中地址进行访问具体的数据

初始化阶段

初始化阶段会执行静态代码块中的代码,并为静态变量赋值
初始化阶段会执行字节码文件中clinit部分的字节码指令

  • clinit方法中的执行顺序与Java中编写的顺序一致

添加Java虚拟机参数 -XX:+TraceClassLoading 开启功能打印出加载并初始化的类
怎样会触发类的初始化操作?

  1. 访问一个类的静态变量或者静态方法
  • 注意:静态变量是final修饰的并且等号右边是常量不会触发初始化(在连接的准备阶段就会被赋值-初始化)
  1. 调用Class.forName(String className)
  2. new 一个该类的对象时
  3. 执行Main方法的当前类

clinit指令在特定情况下不会出现

  1. 没有静态代码块且没有静态变量赋值语句
  2. 有静态变量的声明,但没有赋值语句(初始化目的是为了给静态变量赋值)
  3. 静态变量是final修饰的并且等号右边是常量(在连接的准备阶段就会被赋值-初始化)

注意:

  • 访问父类的静态变量。只初始化父类
  • 数组的创建不会导致数组中的类进行初始化:new的是数组
  • final修饰的变量右边不是一个单纯的常量,如果需要执行指令才能得出结果,则会执行clinit方法进行初始化

总结回答

类的生命周期有加载、连接、初始化、使用、卸载
加载阶段是通过类加载器把字节码信息加载到内存中,转换成内部可识别的信息,存放在方法区和堆上。字节码信息可以通过本地文件、网络传输和动态代理生成
连接阶段又被分为验证、准备和解析。
验证:是否符和Java虚拟机规范,文件格式、版本号、指令信息等等
准备:是为静态变量分配内存赋初始值
解析:是将常量池中的符号引用替换成指向内存的直接引用
初始化阶段会执行静态代码块并为静态变量赋值
使用阶段是程序可以使用类来创建对象、调用方法
卸载的话就是如果一个类不再被使用,且没有任何引用指向它,那么这个类就可能会被垃圾回收,释放内存空间

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

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

相关文章

Spring依赖注入之@autowire注解详解

目录 autowire用法 autowire注解底层逻辑 逻辑处理类AutowiredAnnotationBeanPostProcessor postProcessMergedBeanDefinition获取注入点 postProcessProperties针对注入点字段或者方法获取bean 字段注入 set方法注入 autowire用法 属性上:先根据属性类型去找…

MySQL MHA高可用配置及故障切换

一、MHA相关概念 1.什么是 MHA MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 …

String转JsonObject 再转list<Map<String,Object>>

String转JsonObject 再转list<Map<String,Object>>&#xff1a; 要将字符串 "[{“a”:“1”},{“a”:“2”},{“a”:“3”}]"要将字符串 “[{“a”:“1”},{“a”:“2”},{“a”:“3”}]” 转换为 List>&#xff0c;首先需要将字符串解析为 JSONObje…

二百零七、Flume——Flume实时采集5分钟频率的Kafka数据直接写入ODS层表的HDFS文件路径下

一、目的 在离线数仓中&#xff0c;需要用Flume去采集Kafka中的数据&#xff0c;然后写入HDFS中。 由于每种数据类型的频率、数据大小、数据规模不同&#xff0c;因此每种数据的采集需要不同的Flume配置文件。玩了几天Flume&#xff0c;感觉Flume的使用难点就是配置文件 二、…

信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,cpu寄存器),信号的处理流程详细介绍+抽象图解

目录 信号的处理时机 引入 思考 -- 什么时候才能算合适的时候呢? 用户态转为内核态 引入 内核地址空间 引入 思考 -- 进程为什么能切换成内核态呢? 虚拟地址空间 注意点 原理 (总结一下) 为什么如何进入内核态 引入 介绍 底层原理(int 80) cpu的寄存器 用…

nodejs express vue uniapp新闻发布系统源码

开发技术&#xff1a; node.js&#xff0c;mysql5.7&#xff0c;vscode&#xff0c;HBuilder nodejs express vue uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索新闻&#xff0c;新闻分类&#xff0c;新闻列表 点击新闻进入新闻详情&#xff0…

Jetson JetPack-5.1.2-L4T-R35.4.1 修复deskew algorithm的问题

1. 前言 官方Orin Nano开发套件 版本: JetPack 5.1.2 2. 问题描述 使用的是带有Orin Nano EVK的GMSL相机,但我无法看到MIPI帧。 这里是媒体设备信息: Media controller API version 5.10.120Media device information ------------------------ driver tegra-…

MySQL内部存储代码常用实现方式

MySQL内部存储代码方式包括SQL语言、存储过程、触发器、函数等。其中&#xff0c;最常用的是SQL语言和存储过程。 一个应用场景是&#xff0c;假设有一个电商网站的订单系统&#xff0c;需要在用户下单成功后自动发送一封邮件通知用户订单号和交易金额。这时可以通过存储过程实…

SSH配置免密登录

配置免密登录的步骤 要配置SSH免密登录&#xff0c;需要进行以下几步&#xff1a; 步骤一&#xff1a;生成SSH密钥对 首先&#xff0c;在本地计算机上生成SSH密钥对。这包括一个私钥&#xff08;private key&#xff09;和一个公钥&#xff08;public key&#xff09;。 打…

计算机网络——网络可靠性及网络出口配置

1. 前言&#xff1a; 学习目标&#xff1a; 1.了解链路聚合的作用 2. 了解ACL的工作原理 3. 了解NAT的工作原理和配置 2. 网络可靠性方案 网络可靠性是指网络在面对各种异常情况或故障时&#xff0c;能够维持正常运行和提供服务的能力。这包括防止网络中断、减小数据丢失的可能…

spring boot零配置

spring boot是如何选择tomcat还是Jett作为底层服务器的呢&#xff1f; springboot通过ServletWebServerApplicationContext的onRefresh()方法&#xff0c;会创建web服务 protected void onRefresh() {super.onRefresh();try {// 创建web服务createWebServer();}catch (Throwab…

PyTorch 之 Dataset 类入门学习

PyTorch 之 Dataset 类入门学习 Dataset 类简介 PyTorch 中的 Dataset 类是一个抽象类&#xff0c;用来表示数据集。通过继承 Dataset 类可以进行自定义数据集的格式、大小和其它属性&#xff0c;供后续使用&#xff1b; 可以看到官方封装好的数据集也是直接或间接的继承自 …

6.Gin 路由详解 - GET POST 请求以及参数获取示例

6.Gin 路由详解 - GET POST 请求以及参数获取示例 GET POST 请求以及参数获取示例 Get 请求&#xff1a;获取 Quary 参数 // 获取query参数示例&#xff1a;GET /user?uid20&namejack&page1 r.GET("/user", func(c *gin.Context) {// 获取参数// Query获取参…

[机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应

目录 前言&#xff1a; 一、道家的核心思想 二、恒者恒强&#xff0c;弱者恒弱的马太效应 三、马太效应与道家思想的统一 3.1 大多数的理解 3.2 个人的理解 四、矛盾的对立统一 前言&#xff1a; 马太效应和强弱互转的道家思想&#xff0c;都反应了自然规律和社会规律&…

SVN 修改版本库地址url路径

一、win11用户 1. win11系统右链菜单比较优秀&#xff0c;如果菜单中选择“TortoiseSVN”找不到“重新定位”&#xff0c;如下图所示&#xff0c;则需要添加右键菜单&#xff1a; 2.添加右键菜单&#xff1a;选择“TortoiseSVN”&#xff0c;点击设置&#xff0c;如下图所示&a…

Vue 项目实战——如何在页面中展示 PDF 文件以及 PDFObject 插件实战

文章目录 &#x1f4cb;前言&#x1f3af;使用 HTML 标签&#x1f9e9; embed 标签&#x1f9e9; object标签&#x1f9e9; iframe标签&#x1f9e9;完整代码 &#x1f3af;使用 PDFObject 插件&#x1f9e9;为什么使用 PDFObject 插件&#xff08;AI翻译&#xff09;&#x1f…

【微服务】SaaS云智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

uniapp相关记录

一、自定义我的物品组件 my_goods.vue <template><view class"goods-item"><!-- 左侧 --><view class"goods-item-left"><radio :checked"goods.goods_state" color"#c00000" v-if"showRadio" …

【洛谷 B2003】输出第二个整数 题解(顺序结构+输入输出)

输出第二个整数 题目描述 输入三个整数&#xff0c;整数之间由一个空格分隔。把第二个输入的整数输出。 输入格式 只有一行&#xff0c;共三个整数&#xff0c;整数之间由一个空格分隔。 输出格式 只有一行&#xff0c;一个整数&#xff0c;即输入的第二个整数。 样例 #…

华为云IoT与OpenHarmony深度协同,加速设备上鸿即上云【云驻共创】

本次专题论坛探讨了华为云IoT与Open Harmony的深度协同、边缘屏蔽硬件差异、实现智慧隧道全方位智能化管理&#xff0c;以及华为云与Open Harmony生态的合作。同时也介绍了华为云物联网卡平台、HTTP2协议以及华为物联网在交通领域的应用。 一&#xff0e;华为云IoT与Open Harm…