【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 准备
- 给静态变量分配内存并赋初值。
- 每一种基本数据类型和引用数据类型都有其初始值
数据类型 | 初始值 |
---|---|
int | 0 |
long | 0L |
short | 0 |
char | ‘\u0000’ |
byte | 0 |
bolean | false |
double | 0.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中编写的顺序是一致的。
- 以下几种方式会导致类的初始化:
-
-
- 访问一个类的静态变量或者静态方法,(注意:变量是final修饰的并且等号右边是常量不会触发初始化)
-
-
-
- 调用Class.forName(String className)
-
-
-
- new一个该类的对象时
-
-
-
- 执行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】类的声明周期(加载、连接、初始化)
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 JVM 一、类的声明周期(加载阶段…...

开源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 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。该命令的基本格式如下: [rootlocalhost ~]# mv 【选项】 源文件 目标文件 -f:强制覆盖,如果目标文…...

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

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

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

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

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

halcon roberts、 prewitt_amp、 sobel_amp、 edges_image、 laplace_of_gauss 对比
原图 灰度: roberts 算子: prewitt算子 sobel 算子 canny算子 拉普拉斯 代码: 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
请求场景: 当前页面URL:http://127.0.0.1:8000/testcase 跳转请求页面URL: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软件的层次结构
目录 一、层次图 二、用户层软件 三、设备独立性软件 主要实现的功能: 编辑四、中断处理程序 五、总结 注意: 一、层次图 二、用户层软件 三、设备独立性软件 主要实现的功能: ①向上层提供统一的调用接口(如read/write…...

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

黑豹程序员-架构师学习路线图-百科:PowerDesigner数据库建模的行业标准
PowerDesigner最初由Xiao-Yun Wang(王晓昀)在SDP Technologies公司开发完成。 目前PowerDesigner是Sybase的企业建模和设计解决方案,采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并…...
Iterator 和 ListIterator 的区别(简要说明)
Iterator 和 ListIterator 的区别 ListIterator有add()方法,可以向List中添加对象,而Iterator不能 ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法&am…...
TypeScript - 函数 - 剩余参数
什么是剩余参数 剩余参数就是 一个数组。剩余参数有什么注意事项 剩余参数必须放在所有参数的最后! 剩余参数必须放在所有参数的最后! 剩余参数必须放在所有参数的最后! 【无论是普通参数、可选参数、有默认值的参数,剩余参数都…...
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标签 这两个标签它是没有任意意义的,主…...

iOS iGameGuardian修改器检测方案
一直以来,iOS 系统的安全性、稳定性都是其与安卓竞争的主力卖点。这要归功于 iOS 系统独特的闭源生态,应用软件上架会经过严格审核与测试。所以,iOS端的作弊手段,总是在尝试绕过 App Store 的审查。 常见的 iOS 游戏作弊…...
显示一个文件夹下所有图片的直方图之和
针对3D图像的,因为所有3D图像的2D切片都在一个文件夹里,所以要进行直方图各个像素值数量的累加。 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…...

编程实例:操作简单的台球计时计费软件推荐,可以连接灯控硬件设备以及灯控器布线图编程
编程实例:操作简单的台球计时计费软件推荐,可以连接灯控硬件设备以及灯控器布线图编程 1、计时计费功能 :开台时间和所用的时长直观显示,每3秒即可刷新一次时间。 2、销售商品功能 :商品可以绑定桌子最后一起结账&…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...