当前位置: 首页 > news >正文

【JVM】类的声明周期(加载、连接、初始化)


在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


JVM

  • 一、类的声明周期(加载阶段)
    • 1.1 查看内存中的对象
  • 二、类的声明周期(连接阶段)
    • 2.1 验证
    • 2.2 准备
    • 2.3 解析
  • 三、类的声明周期(初始化阶段)

一、类的声明周期(加载阶段)

  • 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息程序员可以使用Java代码拓展的不同的渠道。
  • 2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
    • 方法区是一个虚拟概念
  • 3、生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。
    • InstanceKlass包含:基本信息、常量池、字段、方法、虚方法表(实现多态的基础)
  • 4、同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class)对象。
    • 作用是在ava代码中去获取类的信息以及存储静态字段的数据(JDK8及之后)

在这里插入图片描述


  • 在JDK8开始,静态字段存放在堆区,在JDK8之前是存放在方法区的

方法区中的InstanceKlass对象是用C++编写的,Java代码一般不能直接操作用C++语言编写的对象,所以Java就在堆区上创建了一个Java.lang.Class用Java语言包装之后的对象,可以让Java在代码中获取到,Java.lang.Class对象里包含的字段要少于方法区中InstanceKlass对象包含的字段,这样做的原因是对于开发者来说,并不需要访问InstanceKlass对象中的所有字段信息,例如Java底层实现多态时调用方法区中的虚方法表,这个虚方法表是不需要开发者调用的,这样Java虚拟机就能很好地控制开发者访问数据的范围.。

1.1 查看内存中的对象

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

在这里插入图片描述


在这里插入图片描述


  • 输入java进程号(打开cmd窗口,输入jps命令,就会展示出所有java进程及对应的id)

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


  • 点击Tools->Object Histogram

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


二、类的声明周期(连接阶段)

2.1 验证

  • 验证内容是否满足《Java虚拟机规范》

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

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

在这里插入图片描述


  • 2.元信息验证,例如类必须有父类(super不能为空)。
  • 3.验证程序执行指令的语义,比如方法内的指令执行中跳转到不正确的位置。
  • 4.符号引用验证,例如是否访问了其他类中privatel的方法等。

Hotspot JDK8中虚拟机源码对版本号检测的代码如下:

return (major >= JAVA_MIN_SUPPORTED_VERSION) &&(major <= max_version)  &&((major != max_version) ||(minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION));
  • major:主版本号
  • minor:副版本号
  • JAVA_MIN_SUPPORTED_VERSION:支持的最低版本,JDK8中常量是45,代表JDK1.0
  • max_version:最高版本,JDK中是52,代表JDK8
  • JAVA_MAX_SUPPORTED_MINOR_VERSION:支持的最高副版本号,JDK未使用,为0
  • 主版本号不能高于运行环境主版本号,如果主版本号相等,副版本号也不能超过。

2.2 准备

  • 给静态变量分配内存并赋初值。
  • 每一种基本数据类型和引用数据类型都有其初始值
数据类型初始值
int0
long0L
short0
char‘\u0000’
byte0
boleanfalse
double0.0
引用数据类型null
  • final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。

2.3 解析

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

在这里插入图片描述


在这里插入图片描述


三、类的声明周期(初始化阶段)

  • 初始化阶段会执行静态代码块中的代码,并为静态变量赋值
  • 初始化阶段会执行字节码文件中clinit部分的字节码指令,其中cl是class的前两个字母,init就是初始化,所以这一部分的含义就是类的初始化。
  • 源码:
public class Demo4 {public static int value = 1;static {value = 2;}public static void main(String[] args) {}
}
  • 字节码:
iconst_1
putstatic #2 <com/jvmdemo/Demo4.value : I>
iconst_2
putstatic #2 <com/jvmdemo/Demo4.value : I>
return

iconst_1:将常量1放入操作数栈中
putstatic :从操作数栈中获取值设置到静态变量中(即设置value值为1)
iconst_2:将常量2放入操作数栈中
putstatic :从操作数栈中获取值设置到静态变量中(即设置value值为2)

  • clinit方法中的执行顺序与]ava中编写的顺序是一致的。
  • 以下几种方式会导致类的初始化:
      1. 访问一个类的静态变量或者静态方法,(注意:变量是final修饰的并且等号右边是常量不会触发初始化)
      1. 调用Class.forName(String className)
      1. new一个该类的对象时
      1. 执行Main方法的当前类
  • **添加-XX:TraceClassLoading参数可以打印出加载并初始化的类
  • 源码(未添加final修饰):
public class Demo4 {public static void main(String[] args) {int i = Demo5.i;System.out.println(i);}
}
class Demo5 {static {System.out.println("初始化了");}public static int i = 0;
}

在这里插入图片描述

  • 源码(添加final修饰):
public class Demo4 {public static void main(String[] args) {int i = Demo5.i;System.out.println(i);}
}
class Demo5 {static {System.out.println("初始化了");}public static final int i = 0;
}

在这里插入图片描述


相关文章:

【JVM】类的声明周期(加载、连接、初始化)

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 一、类的声明周期&#xff08;加载阶段…...

开源3D激光(视觉)SLAM算法汇总(持续更新)

原文连接 目录 一、Cartographer 二、hdl_graph_slam 三、LOAM 四、LeGO-LOAM 五、LIO-SAM 六、S-LOAM 七、M-LOAM 八、livox-loam 九、Livox-Mapping 十、LIO-Livox 十一、FAST-LIO2 十二、LVI-SAM 十三、FAST-Livo 十四、R3LIVE 十五、ImMesh 十六、Point-LIO 一、Cartograph…...

绕WAF手法总结

云锁 被拦截 http://www.test123.com/article.php?id1%20union%20select%201,2,3 绕过 http://www.test123.com/article.php?id-1/*!36000union*//*!36000distinct*//*!36000select*/1,2,user() 360websec 被拦截 http://www.xxx.com.cn/productshow.php?id79 绕过 http:/…...

Linux mv命令:移动文件或改名

mv 命令&#xff08;move 的缩写&#xff09;&#xff0c;既可以在不同的目录之间移动文件或目录&#xff0c;也可以对文件和目录进行重命名。该命令的基本格式如下&#xff1a; [rootlocalhost ~]# mv 【选项】 源文件 目标文件 -f&#xff1a;强制覆盖&#xff0c;如果目标文…...

在 Elasticsearch 中丰富你的 Elasticsearch 文档

作者&#xff1a;David Pilato 对于 Elasticsearch&#xff0c;我们知道联接应该在 “索引时” 而不是查询时完成。 本博文是一系列三篇博文的开始&#xff0c;因为我们可以在 Elastic 生态系统中采取多种方法。 我们将介绍如何在 Elasticsearch 中做到这一点。 下一篇博文将介…...

探营云栖大会:蚂蚁集团展出数字人全栈技术,三大AI“机器人”引关注

一年一度的科技盛会云栖大会将于10月31日正式开幕。30日&#xff0c;记者来到云栖大会展区探营&#xff0c;提前打卡今年上新的“黑科技”。 记者在蚂蚁集团展馆看到&#xff0c;超1亿人参与的亚运“数字火炬手”全栈技术首次公开展示&#xff0c;还可体验基于数字人技术的“数…...

hdlbits系列verilog解答(8位宽移位寄存器)-24

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 这项练习是module_shift移位寄存器的延伸。模块端口不是只有单个引脚,我们现在有以向量作为端口的模块,您将在其上附加线向量而不是普通线网数据。与 Verilog 中的其他位置一样,端口的向量长度不必与连接到它…...

LeetCode 275. H 指数 II

原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数&#xff0c;citations 已经按照 升序排列 。计算并返回该研究者的 h…...

Android 优质的UI组件汇总

1、RuleView &#xff1a;Android自定义标尺控件(选择身高、体重等) 链接&#xff1a;https://github.com/cStor-cDeep/RuleView 2、DashboardView &#xff1a;Android自定义仪表盘View&#xff0c;仿新旧两版芝麻信用分、炫酷汽车速度仪表盘 链接&#xff1a;https://git…...

halcon roberts、 prewitt_amp、 sobel_amp、 edges_image、 laplace_of_gauss 对比

原图 灰度&#xff1a; roberts 算子&#xff1a; prewitt算子 sobel 算子 canny算子 拉普拉斯 代码&#xff1a; read_image (Image, C:/Users/alber/Desktop/opencv_images/canny.png) rgb1_to_gray (Image, GrayImage)* 测试 roberts 算子 roberts (GrayImage, ImageRoberts…...

Vue2 跨域问题报错AxiosError net::ERR_FAILED、 Network Error、ERR_NETWORK

请求场景&#xff1a; 当前页面URL&#xff1a;http://127.0.0.1:8000/testcase 跳转请求页面URL&#xff1a;http://127.0.0.1:5000/testcase_orm 使用axios请求 时 页面提示跨域报错 跨域报错信息 > Access to XMLHttpRequest at http://127.0.0.1:5000/testcase_orm fr…...

第五章 I/O管理 四、I/O软件的层次结构

目录 一、层次图 二、用户层软件 三、设备独立性软件 主要实现的功能&#xff1a; ​编辑四、中断处理程序 五、总结 注意&#xff1a; 一、层次图 二、用户层软件 三、设备独立性软件 主要实现的功能&#xff1a; ①向上层提供统一的调用接口&#xff08;如read/write…...

云服务器安装Hbase

文章目录 1. HBase安装部署2.HBase服务的启动3.HBase部署高可用&#xff08;可选&#xff09;4. HBase整合Phoenix4.1 安装Phoenix4.2 **Phoenix Shell** 操作4.3 表的映射4.4 Phoenix二级索引4.4.1 全局索引&#xff08;global index&#xff09;4.4.2 包含索引(covered index…...

黑豹程序员-架构师学习路线图-百科:PowerDesigner数据库建模的行业标准

PowerDesigner最初由Xiao-Yun Wang&#xff08;王晓昀&#xff09;在SDP Technologies公司开发完成。 目前PowerDesigner是Sybase的企业建模和设计解决方案&#xff0c;采用模型驱动方法&#xff0c;将业务与IT结合起来&#xff0c;可帮助部署有效的企业体系架构&#xff0c;并…...

Iterator 和 ListIterator 的区别(简要说明)

Iterator 和 ListIterator 的区别 ListIterator有add()方法&#xff0c;可以向List中添加对象&#xff0c;而Iterator不能 ListIterator和Iterator都有hasNext()和next()方法&#xff0c;可以实现顺序向后遍历&#xff0c;但是ListIterator有hasPrevious()和previous()方法&am…...

TypeScript - 函数 - 剩余参数

什么是剩余参数 剩余参数就是 一个数组。剩余参数有什么注意事项 剩余参数必须放在所有参数的最后&#xff01; 剩余参数必须放在所有参数的最后&#xff01; 剩余参数必须放在所有参数的最后&#xff01; 【无论是普通参数、可选参数、有默认值的参数&#xff0c;剩余参数都…...

Python之前端

标签的分类 1. 单标签img br hr <img /> 2. 双标签a h p div <a></a> 3. 按照标签属性分类1. 块儿标签# 自己独自占一行h1-h6 p div2. 行内(内联)标签# 自身文本有多大就占多大a span u i b s div标签和span标签 这两个标签它是没有任意意义的&#xff0c;主…...

iOS iGameGuardian修改器检测方案

一直以来&#xff0c;iOS 系统的安全性、稳定性都是其与安卓竞争的主力卖点。这要归功于 iOS 系统独特的闭源生态&#xff0c;应用软件上架会经过严格审核与测试。所以&#xff0c;iOS端的作弊手段&#xff0c;总是在尝试绕过 App Store 的审查。 常见的 iOS 游戏作弊&#xf…...

显示一个文件夹下所有图片的直方图之和

针对3D图像的&#xff0c;因为所有3D图像的2D切片都在一个文件夹里&#xff0c;所以要进行直方图各个像素值数量的累加。 import sys import cv2 import numpy as np import os, glob from skimage import data,io import matplotlib.pyplot as plt np.set_printoptions(thres…...

编程实例:操作简单的台球计时计费软件推荐,可以连接灯控硬件设备以及灯控器布线图编程

编程实例&#xff1a;操作简单的台球计时计费软件推荐&#xff0c;可以连接灯控硬件设备以及灯控器布线图编程 1、计时计费功能 &#xff1a;开台时间和所用的时长直观显示&#xff0c;每3秒即可刷新一次时间。 2、销售商品功能 &#xff1a;商品可以绑定桌子最后一起结账&…...

STM32架构解析:哈佛与冯·诺依曼的工程实践

STM32处理器架构解析&#xff1a;哈佛结构与冯诺依曼结构的工程实践 1. 计算机体系结构基础 1.1 冯诺依曼体系结构 冯诺依曼体系结构&#xff08;Von Neumann architecture&#xff09;是现代计算机的基础设计范式&#xff0c;其核心特征包括&#xff1a; 统一存储结构 &am…...

麒麟V10 x86_64系统下Qt 5.12.7安装全攻略(附常见报错解决方案)

麒麟V10 x86_64系统Qt 5.12.7深度安装指南与疑难攻坚 国产操作系统生态的崛起让越来越多的开发者开始关注麒麟平台。作为一款基于Linux的国产操作系统&#xff0c;麒麟V10在x86_64架构下的表现尤为出色。本文将带你全面掌握Qt 5.12.7在麒麟V10 x86_64系统上的安装与配置技巧&am…...

如何利用WiFi信号实现无摄像头人体姿态跟踪:RuView完整指南

如何利用WiFi信号实现无摄像头人体姿态跟踪&#xff1a;RuView完整指南 【免费下载链接】RuView Production-ready implementation of InvisPose - a revolutionary WiFi-based dense human pose estimation system that enables real-time full-body tracking through walls u…...

基于uniapp的SUPOIN PDA激光扫码广播监听功能实现与优化

1. 为什么选择SUPOIN PDA激光扫码方案 在工业级移动应用中&#xff0c;扫码功能可以说是刚需中的刚需。我做过不少仓库管理、物流配送的项目&#xff0c;深刻体会到扫码速度差个0.5秒&#xff0c;工人一天下来就能多处理上百件货物。SUPOIN PDA设备自带的激光扫码模块&#xf…...

别再只盯着ONNX了!用PNNX把PyTorch模型轻松转成ncnn格式(安卓部署实战)

深度学习模型安卓部署实战&#xff1a;PNNX与ONNX转换工具深度对比 在移动端部署深度学习模型时&#xff0c;模型转换环节往往是开发者遇到的第一个技术瓶颈。许多团队习惯性地选择ONNX作为中间格式&#xff0c;却忽视了更高效的替代方案。本文将带您深入探索PNNX这一专为PyTor…...

苹果M系列芯片用户必看:三步搞定iOS游戏在Mac上的完美运行方案

苹果M系列芯片用户必看&#xff1a;三步搞定iOS游戏在Mac上的完美运行方案 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover 还在为Mac上无法畅玩心爱的iOS游戏而烦恼吗&#xff1f;你是否想过&#xff…...

Token 中文定名词元,国产 AI 工具如何抢占词元红利?

3 月 23 日&#xff0c;中国发展高层论坛 2026 年年会上&#xff0c;国家数据局局长刘烈宏正式官宣&#xff1a;AI 领域核心术语 Token 的中文标准译名确定为“词元”。这一官方定名&#xff0c;结束了之前 “令牌”“代币”“词块” 等译法混用的行业乱象&#xff0c;为中国 A…...

3分钟上手!FrankMocap让普通摄像头变身专业动捕设备

3分钟上手&#xff01;FrankMocap让普通摄像头变身专业动捕设备 【免费下载链接】frankmocap A Strong and Easy-to-use Single View 3D HandBody Pose Estimator 项目地址: https://gitcode.com/gh_mirrors/fr/frankmocap 在数字内容创作与交互设计领域&#xff0c;3D动…...

RWKV7-1.5B-g1a实操手册:curl命令调用generate接口+参数组合避坑指南

RWKV7-1.5B-g1a实操手册&#xff1a;curl命令调用generate接口参数组合避坑指南 1. 模型简介 rwkv7-1.5B-g1a 是基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合以下场景&#xff1a; 基础问答文案续写简短总结轻量中文对话 这个1.5B参数的版本在单卡24GB显存的GPU…...

AlwaysOnTop:重新定义你的数字工作空间

AlwaysOnTop&#xff1a;重新定义你的数字工作空间 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 想象一下这样的场景&#xff1a;你正在为一个重要的项目编写报告&#xff0c;…...