JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

news2024/12/22 18:55:39

目录

  • 1.加载阶段
  • 2.连接阶段
    • 1.验证
    • 2.准备
    • 3.解析
  • 3.初始化阶段
  • 4.总结

在这里插入图片描述
类的生命周期
在这里插入图片描述

1.加载阶段

⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。
程序员可以使用Java代码拓展的不同的渠道。
⚫ 2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
⚫ 3、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。
生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。
在这里插入图片描述
⚫ 4、同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。
作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8及之后存放在堆区中)。在JDK8以前是静态字段存放在方法区中
主要作用:在实现反射的时候需要先拿到类的基本的信息(class对象)通过其获取其内的方法和字段,进行一系列的操作。
在这里插入图片描述
⚫ 对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中所有信息。
这样Java虚拟机就能很好地控制开发者访问数据的范围。

  1. instanceKlass是使用C++语言编写的对象,Java语言不能直接去操作这个对象,
  2. Java.lang.Class类中包含的字段要少于instanceKlass中的,instanceKlass中的许多字段是开发者用不到的,为了保护这些数据,Java.lang.Class类中只包含开发者需要用到的方法等字段。

在这里插入图片描述

2.连接阶段

在这里插入图片描述

1.验证

⚫ 连接(Linking)阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规
范》中的约束。这个阶段一般不需要程序员参与。
⚫ 主要包含如下四部分,具体详见《Java虚拟机规范》:

  1. 文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。
  2. 元信息验证,例如类必须有父类(super不能为空)。
  3. 验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。
  4. 符号引用验证,例如是否访问了其他类中private的方法等

2.准备

⚫ 准备阶段为静态变量(static)分配内存并设置初始值。
⚫ 注意:涉及到的内存结构只讨论JDK8及之后的版本
在这里插入图片描述

⚫ 准备阶段只会给静态变量赋初始值,而每一种基本数据类型和引用数据类型都有其初始值。
注: final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值在这里插入图片描述

3.解析

⚫ 解析阶段主要是将常量池中的符号引用替换为直接引用。
⚫ 符号引用就是在字节码文件中使用编号来访问常量池中的内容在这里插入图片描述
⚫ 直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。在这里插入图片描述

3.初始化阶段

⚫ 初始化阶段会执行静态代码块中的代码,并为静态变量赋值。
⚫ 初始化阶段会执行字节码文件中clinit部分的字节码指令。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⚫ 以下几种方式会导致类的初始化:
1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
2.调用Class.forName(String className)。
3.new一个该类的对象时。
4.执行Main方法的当前类。
在这里插入图片描述
在这里插入图片描述
⚫ clinit指令在特定情况下不会出现,比如:如下几种情况是不会进行初始化指令执行的。
1.无静态代码块且无静态变量赋值语句。
2.有静态变量的声明,但是没有赋值语句。
3.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化。在这里插入图片描述
⚫ 直接访问父类的静态变量,不会触发子类的初始化。
⚫ 子类的初始化clinit调用之前,会先调用父类的clinit初始化方法。
在这里插入图片描述
在这里插入图片描述
数组的创建不会导致数组中元素的类进行初始化。
在这里插入图片描述
final修饰的变量如果赋值的内容需要执行指令才能得出结果,会执行clinit方法进行初始化。
在这里插入图片描述

4.总结

在这里插入图片描述
在这里插入图片描述
几个要点:
1.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化
(除非要执行方法)。
2.直接访问父类的静态变量,不会触发子类的初始化。子类的初始化cinit调用之前,
会先调用父类的cinit初始化方法。
在这里插入图片描述

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

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

相关文章

SAP 物料凭证在凭证流中显示归档

问题: 在交货单做过PGI/PGR之后,显示物料凭证已归档,但是实际上并不是人为归档 MIGO去显示物料凭证的时候显示不存在 VL09 无法冲销 如下图所示 原因:1.人为做了归档 2.在做PGI的时候出现了异常。导致出现了问题 解决…

本章内容的重点是对各种电子式电动机保护器电路的原理分析和故障维修指导,对电子式电动机保护器以下简称为电动机保护器。

上世纪八十年代之前,电子技术的应用尚处于初级阶段,对电动机的保护任务多由热继电器承担,国内型号为为JR20-XX系列、JR36-XX系列等。其保护机理如下:热继电器由发热元件、双金属片、触点及一套传动和调整机构组成。发热元件是一段…

react-hook-form。 useFieldArray Controller 必填,报错自动获取较多疑问记录

背景 动态多个数据Controller包裹时候,原生html标签input可以add时候自动获取焦点,聚焦到最近不符合要求的元素上面 matiral的TextField同样可以可是x-date-pickers/DatePicker不可以❌ 是什么原因呢,内部提供foucs??属…

【C++】医学影像信息管理系统源码

狭义的医学影像信息系统是指基于医学影像存储和通信系统的管理系统,从技术上解决了影像处理技术。临床信息系统是指支持医院医务人员临床活动,收集和处理患者临床医疗信息的信息管理系统。放射科信息系统是指放射科挂号、分诊、影像诊断报告、信息查询、…

在Qt中解决opencv的putText函数无法绘制中文的一种解决方法

文章目录 1.问题2.查阅资料3.解决办法 1.问题 在opencv中,假如直接使用putText绘制中文,会在图像上出现问号,如下图所示: 2.查阅资料 查了一些资料,说想要解决这个问题,需要用到freetype库或者用opencv…

ASO优化之Google Play评分评论的重要性

应用程序的成果不仅仅是拥有功能齐全且无错误的产品,评分和评论会影响谷歌应用商店的排名算法,好评和差评都会影响应用在商店中的排名,这是关于与用户建立信任的一个环节。 1、积极主动地管理评论。 定期监控评论、解决用户问题以及根据反馈…

python脚本-网页爬虫获取网页图片

python脚本-网页爬虫获取网页图片 代码 import requests import re import time url"http://10.9.47.154/python-spider/" # 爬取网站的url headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

阿里云双11特惠:云服务器1年99元,新老同享,续费同价!

2023年双11阿里云推出了金秋云创季活动,云服务器特惠,2核2G云服务器1年99元,新老同享,续费同价! 活动地址: https://txy.ink/aliyun/ 活动详情: 阿里云面向个人开发者、学生、小微企业推出爆…

电压跟随器输入脚悬空引起的振荡

昨天在调试一个电路板的时候,发现进单片机AD脚的信号上面有个50Hz的波形,峰峰值还挺大,有几百毫伏。这种情况只有在输入端悬空的时候才出现;在输入端接了信号或者传感器的时候,就又正常了。 经过排查,发现…

92 数据流中的中位数

数据流中的中位数 题解1 小根堆大根堆另一种写法 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFi…

使用Java与Jsoup库构建有趣的爬虫项目

目录 一、网络爬虫的概念和应用 二、Jsoup库的功能和优势 三、使用Java与Jsoup库编写网络爬虫 四、网络爬虫的法律和道德问题 五、注意事项 六、总结 本文将深入探讨如何使用Java与Jsoup库构建一个实际且有趣的网络爬虫项目。我们将首先简要介绍网络爬虫的概念和应用&…

运动耳机哪个好?跑步耳机哪个好?运动耳机排行榜推荐

​运动时没有音乐的相伴真的很枯燥,当你打开音乐,世界就只剩下你和你的运动。运动的同时听歌还能让你完全沉浸在音乐中,享受运动的乐趣。无论是在激烈的比赛中,还是在轻松的晨跑中,它都能为你提供最佳的听觉体验。然而…

银河麒麟x86版、银河麒麟arm版操作系统编译zlmediakit

脚本 # 安装依赖 gcc-c.x86_64 这个不加的话会有问题 sudo yum -y install gcc gcc-c libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git openssl-devel gcc-c.x86_64mkdir -p /home/zenglg cd /home/zenglg git clone --depth 1 https://gitee.com/xia-chu…

【23-24 秋学期】NNDL 作业6 卷积

卷积常用于特征提取 实验过程中注意认真体会“特征提取”,弄清楚为什么卷积能够提取特征。 一、概念 用自己的语言描述“卷积、卷积核、特征图、特征选择、步长、填充、感受野”。 二、探究不同卷积核的作用 卷积神经网络工作原理的直观理解_superdont的博客-CS…

DCN无线网络解决方案

一、概述 网络环境建设项目的目标是要建设一套安全可靠、性能领先的无线网络系统,能够良好支撑协同工作平台。经过几年的建设,网络建设已经由大规模建设阶段逐步转入“建设与服务并重,着力深化应用”的新阶段。在此阶段,网络工作…

基于Apache SeaTunnel 的数据精确一致性技术实践

引言 在分布式系统中,保障数据一致性是至关重要的任务之一。数据一致性是指分布式系统中的各个节点在进行数据更新时能够保持数据的准确性和完整性。然而,由于网络延迟、节点故障等原因,分布式系统中的数据一致性问题变得复杂而具有挑战性。…

行业揭秘:腾讯共享wifi码推广零加盟费是真的吗?

近年来,“共享经济”概念在商业领域取得了巨大成功。共享WiFi贴码成为共享经济的一种典型案例,被越来越多的人看作是一种低风险、高回报的投资方式。而在这个市场中,腾讯WiFi码推广以“零加盟费”而备受关注。本文将探讨腾讯WiFi码推广零加盟…

中国商界杂志中国商界杂志社中国商界编辑部2023年第10期目录查询

要闻 我国旅游市场步入理性繁荣阶段 赵熠如; 10-11 产业 老国货品牌再迎高光时刻 能否留住流量 涂瀚文; 12-13《中国商界》投稿:cnqikantg126.com 金融集聚有力 促进长三角城市高质量发展 刘盛坤; 14-17 辽宁农贸市场亟待优化升级路径在哪儿&#x…

SpringMVC Day 11 : 零 xml 配置

前言 欢迎来到《Spring MVC Day 11: 零XML配置》!在之前的学习中,我们已经掌握了如何使用Spring MVC框架构建灵活、高效的Web应用程序。然而,我们可能还记得那些繁琐的XML配置文件,它们是我们在过去几天中使用的方式。 好消息是…

数据库概念和sql语句+库表管理操作+数据库用户管理

一、数据库的概念: 进入数据库的奇妙世界:mysql -u root -p123456 数据库是一个系统,是一个人机系统。由硬件、OS操作系统、数据库、DBMS和数据库的 用户共同组成。 用户时通过DBMS(各种数据库的软件)来对数据库进行…