【JVM】总结篇-字节码篇
字节码篇
Java虚拟机的生命周期
JVM的组成
Java虚拟机的体系结构
什么是Java虚拟机
虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)
class文件结构概述
知道字节码吗?字节码都有哪些?
1. 加载和存储指令(Load and Store Instructions)
这些指令用于从操作数栈或者局部变量表加载数据,或者将数据存储到局部变量表中。加载指令:将局部变量表中的数据加载到操作数栈。iload, aload, fload, dload, lload:将局部变量表中的基本类型(如 int、Object 等)加载到操作数栈。
iload_<index>, aload_<index>, fload_<index> 等:将局部变量表的某个索引处的数据加载到栈中(如 iload_0 加载局部变量表中索引为 0 的 int 类型数据)。
存储指令:将操作数栈中的数据存储到局部变量表中。istore, astore, fstore, dstore, lstore:将栈顶的数据存储到局部变量表中。
istore_<index>, astore_<index>, fstore_<index> 等:将操作数栈的值存储到局部变量表的某个索引。2. 运算指令(Arithmetic and Logical Instructions)
这些指令执行基本的数学运算或逻辑运算。算术运算:iadd, isub, imul, idiv, irem:对 int 类型数据进行加法、减法、乘法、除法和取余。
fadd, fsub, fmul, fdiv, frem:对 float 类型数据进行相应的运算。
dadd, dsub, dmul, ddiv, drem:对 double 类型数据进行运算。
ladd, lsub, lmul, ldiv, lrem:对 long 类型数据进行运算。
逻辑运算:iand, ior, ixor:对 int 类型数据执行按位与、或、异或操作。
land, lor, lxor:对 long 类型数据执行按位与、或、异或操作。3. 控制流指令(Control Flow Instructions)
这些指令用于改变程序的执行流程,包括条件跳转、循环控制等。条件跳转指令:ifeq, ifne, iflt, ifge, ifgt, ifle:根据栈顶数据进行条件判断(例如:如果 int 值等于 0,则跳转)。
if_icmpeq, if_icmpne, if_icmplt, if_icmpge, if_icmpgt, if_icmple:比较栈顶的两个 int 类型的值,根据比较结果跳转。
无条件跳转:goto:无条件跳转到指定的字节码地址。
jsr, ret:用于子程序调用和返回(jsr 和 ret 已经被标记为废弃,不再常用)。
返回指令:return:从当前方法返回。
ireturn, lreturn, freturn, dreturn, areturn:返回不同类型的方法的结果。4. 对象操作指令(Object Manipulation Instructions)
这些指令用于对象的创建、字段访问、方法调用等操作。对象创建:new:创建一个新的对象(例如 new 操作符)。
newarray, anewarray, multianewarray:创建不同类型的数组。
字段操作:getstatic, putstatic: 获取或设置类的静态字段。
getfield, putfield: 获取或设置实例字段。
方法调用:invokevirtual, invokespecial, invokestatic, invokeinterface:调用实例方法、构造方法、静态方法或接口方法。
对象方法和字段:instanceof:检查对象是否是某个类型的实例。
checkcast:强制类型转换。5. 堆栈操作指令(Stack Manipulation Instructions)
这些指令用于操作操作数栈上的数据。操作数栈数据压栈和弹栈:
pop, pop2: 弹出操作数栈顶的数据。
dup, dup2: 复制栈顶的元素。
swap: 交换操作数栈的前两个元素。6. 类型转换指令(Type Conversion Instructions)
这些指令用于不同类型之间的转换。类型转换:
i2b, i2c, i2s:将 int 类型转换为 byte、char、short。
l2i, f2i, d2i:将 long、float、double 转换为 int 类型。
f2l, d2l:将 float 和 double 转换为 long 类型。
f2d, i2d, l2d:将 float、int 和 long 转换为 double 类型。7. 异常处理指令(Exception Handling Instructions)
这些指令用于异常处理的控制流。异常跳转:athrow:抛出异常。
异常表:try, catch, finally 结构通过在字节码中记录异常处理表实现。8. 常量池指令(Constant Pool Instructions)
这些指令用于访问常量池中的常量。常量池操作:
ldc, ldc_w, ldc2_w:将常量池中的常量加载到栈中。9. 其他指令
这些指令提供了对 Java 字节码虚拟机执行的低级控制。监视器指令:
monitorenter, monitorexit:用于实现同步(锁定和释放锁)。
Java虚拟机中,数据类型可以分为哪几类?
int a = 1;JVM如何取得a的值
Integer x = 5;int y = 5;比较 x == y 都经过哪些步骤?
- 源代码:
Integer x = 5;
int y = 5;
boolean result = (x == y); // 这里比较 Integer 和 int
-
Java 类型和自动拆箱:
x 是一个 Integer 类型对象,而 y 是一个原始的 int 类型。
在 x == y 的比较中,x 是一个对象,y 是一个基本类型(int)。Java 会进行 自动拆箱,将 Integer 对象 x 拆箱成 int 类型,然后进行基本类型的比较。
自动拆箱的过程是通过 Integer 的 intValue() 方法完成的,因此 x.intValue() 会将 Integer 对象 x 中的值提取为 int 类型,然后与 y 进行比较。 -
编译后的字节码:
假设这段代码已经被编译成字节码,我们可以查看相应的字节码操作。
字节码指令(假设以下字节码来自于 x == y 比较的实现):
0: iconst_5 // 将字面量 5 压入操作数栈
1: invokestatic #2 // 调用 Integer.valueOf(5),返回 Integer 对象,压入操作数栈
4: astore_1 // 将 Integer 对象存储到局部变量表的索引 1(x)
5: iconst_5 // 将字面量 5 压入操作数栈
6: istore_2 // 将 5 存储到局部变量表的索引 2(y)
7: aload_1 // 将 x(Integer 对象)加载到操作数栈
8: invokevirtual #3 // 调用 Integer.intValue() 获取 x 的 int 值
11: iload_2 // 加载局部变量 y(基本类型 int)
12: if_icmpeq 17 // 比较两个 int 值是否相等,如果相等跳转到 17
15: iconst_0 // 压入 0(表示 false)
16: goto 18 // 跳转到 18 处
17: iconst_1 // 压入 1(表示 true)
18: istore_3 // 将比较结果存储到局部变量表的索引 3(result)
- 字节码分析:
iconst_5:将字面量 5 压入操作数栈。这是因为 x = 5 和 y = 5 都是常量 5。
invokestatic #2:调用 Integer.valueOf(5),将常量 5 转换成 Integer 对象,并将 Integer 对象压入操作数栈。
astore_1:将 Integer 对象(即 x)存储到局部变量表的索引 1 位置。
istore_2:将常量 5 存储到局部变量表的索引 2 位置,即 y。
aload_1:将 x(Integer 对象)从局部变量表加载到操作数栈。
invokevirtual #3:调用 Integer.intValue() 方法,将 Integer 对象 x 拆箱成基本类型 int,并将拆箱后的值压入操作数栈。
iload_2:将 y(基本类型 int)从局部变量表加载到操作数栈。
if_icmpeq 17:比较栈顶的两个 int 值是否相等。如果相等,跳转到 17,即跳过 iconst_0,表示比较结果为 true。
iconst_0:如果 x.intValue() 和 y 不相等,压入 0,表示 false。
goto 18:跳转到字节码指令 18,表示结束。
iconst_1:如果 x.intValue() 和 y 相等,压入 1,表示 true。
istore_3:将比较结果存储到局部变量表的索引 3(result)。 - 拆箱过程:
拆箱是 Java 中的自动过程,在 x == y 比较中,x 是 Integer 类型,y 是 int 类型。JVM 会自动调用 Integer 对象的 intValue() 方法,提取 Integer 中的 int 值,然后将其与 y 进行比较。
x.intValue() 等价于 x 的 int 值(即 5)。
x == y 等价于 x.intValue() == y,即 5 == 5。 - 结果:
如果 x 和 y 的值相等,x.intValue() == y 会返回 true,字节码会执行 iconst_1,最终将 true 存储在 result 中。
如果 x 和 y 的值不相等,字节码会执行 iconst_0,最终将 false 存储在 result 中。 - 总结:
在字节码层面,Integer 对象会通过 intValue() 方法拆箱为 int,然后与 int 类型的变量 y 进行比较。
字节码通过 invokevirtual 调用 Integer.intValue() 方法来实现拆箱。
比较操作会根据值的相等性进行跳转,最终将比较结果(true 或 false)存储到局部变量表中。
JVM 处理这类操作时,通过类型转换和方法调用来确保正确的类型比较和结果。
1.包装类的缓存
FLoat Double 无
2.复习intern()字符串 (常量池位置的迁移jdk版本)
String s=new String(“a”);
s.intern();
String s2=“a”;
System.out.println(s == s2);//false
String s3=new String(“a”)+new String(“a”);
s3.intern();
String s4=“aa”;
System.out.println(s3 == s4);;//true
3.String s=new String(“a”);几个对象? 2
相关文章:

【JVM】总结篇-字节码篇
字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box&…...

HTML——28.音频的引入
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>音频引入</title></head><body><!--audio:在网页中引入音频当属性名和属性值一样,可以只写属性名src属性:指定音频文件路径,必…...

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)
此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…...

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开
《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开,本次讲座中来自Xsens的人形机器人与动捕技术专家Jeffrey Muller与Dennis Kloppenburg不仅将就Xsens动作捕捉系统与人形机器人行为训练中的实际应用进行详细讲解,同时还会对目前大家所关注…...
Mac 安装 Flutter 提示 A network error occurred while checking
错误信息 A network error occurred while checking "https://maven.google.com/": Operation timed out原因 在中国大陆(由于访问 Google 服务器的限制导致超时),无法连接到 https://maven.google.com/ 解决方案 需要使用镜像网站 #flutter 使用国内的镜像 export …...
形态学:图像处理中的强大工具
在图像处理中,形态学(Morphology) 是一类基于形状的操作,主要用于提取、分析和处理图像中的几何结构。尽管形态学操作最初是为二值图像设计的,但它也可以应用于灰度图像,帮助提取图像中的结构特征。形态学操…...

树莓派 Pico RP2040 教程点灯 双核编程案例
双核点亮不同的 LED 示例,引脚分别是GP0跟GP1。 #include "pico/stdlib.h" #include "pico/multicore.h"#define LED1 0 // 核心 0 控制的 LED 引脚 #define LED2 1 // 核心 1 控制的 LED 引脚// the setup function runs once when you press …...

2024年大型语言模型(LLMs)的发展回顾
2024年对大型语言模型(LLMs)来说是充满变革的一年。以下是对过去一年中LLMs领域的关键进展和主题的总结。 GPT-4的壁垒被打破 去年,我们还在讨论如何构建超越GPT-4的模型。如今,已有18个组织拥有在Chatbot Arena排行榜上超越原…...
实现单例模式的五种方式
如何实现一个单例 1、构造器需要私有化 2、提供一个私有的静态变量 3、暴露一个公共的获取单例对象的接口 需要考虑的两个问题 1、是否支持懒加载 2、是否线程安全 1、饿汉式 public class EagerSingleton {private static final EagerSingleton INSTANCE new EagerSi…...
pcl源码分析之计算凸包
文章目录 前言一、应用案例二、源码分析1.ConvexHull类2.reconstruct函数3.performReconstruction 函数4.calculateInputDimension 函数 总结 前言 本文分析一下pcl里凸包的源码。什么是凸包以及怎么求解,可以了解一下概念。 一、应用案例 #include <pcl/surfa…...
在K8S中,Pod请求另一个Pod偶尔出现超市或延迟,如何排查?
在Kubernetes中,当Pod请求另一个Pod时偶尔出现超时或延迟,可能是由于多种原因造成的。以下是一些建立的排查步骤: 1. 检查网络配置和插件: 确认你的kubernetes集群使用了合适的网络插件(如Calico、Flannel等…...

3blue1brow线代笔记
向量 物理:空间中的箭头,长度和方向决定一个向量。只要两者相同,可以任意移动保持不变 计算机:有序的数字列表 (数组) 数学:向量可以是任何东西,只要保证两个向量相加以及数字与向量…...

【前端系列】优化axios响应拦截器
文章目录 一、前言🚀🚀🚀二、axios响应拦截器:☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言🚀🚀🚀 ☀️ 回报不在行动之后,回报在行动之中。 这个系列可…...
SQL使用视图
本文将介绍什么是视图,它们怎样工作,何时使用它们。 1. 视图 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。 说明:SQLite 的视图 SQLite 仅支持只读视图,所以视图可以创建ÿ…...

在Windows计算机上打开 HEIC 文件的 6 种有效方法
如果您是 iPhone 用户,您可能对 HEIC 照片很熟悉。这种新兴格式是一种非常高效的图片编码器,它以小得多的尺寸提供至少类似 JPEG 的质量。这对于存储容量较小的手机尤其有利。但是,如何在Windows上打开 HEIC 文件? 假设您用 iDev…...

开源数据集成平台白皮书重磅发布《Apache SeaTunnel 2024用户案例合集》!
2025年新年临近,Apache SeaTunnel 社区用户案例精选📘也跟大家见面啦!在过去的时间里,SeaTunnel 社区持续成长,吸引了众多开发者的关注与支持。 为了致谢一路同行的伙伴,也为了激励更多人加入技术共创&…...
C# delegate 委托使用教程
什么是委托? 委托是定义方法签名的引用类型数据类型,可以定义委托的变量,就像其他数据类型一样,可以引用与委托具有相同签名的任何方法。 它允许方法作为参数传递,并允许事件驱动编程。它们提供了一种以类型安全的方…...

《机器学习》——数据标准化(0~1标准化,z标准化)
文章目录 数据标准化一、什么是标准化二、常用标准化0~1标准化z标准化 三、注意事项 数据标准化 一、什么是标准化 数据标准化是一种数据预处理技术,用于将数据按照一定的规则进行变换,使得不同特征或变量具有可比性和一致性。作用 消除量纲影响 在实际…...
如何监控和管理API接口的调用频率和并发量?
使用监控工具 APM(应用性能管理)工具 功能介绍:APM 工具如 New Relic、AppDynamics 等可以深入监控 API 的性能指标,包括调用频率、并发量、响应时间等。它们通过在应用程序中嵌入代理或使用无侵入式的监测方式,收集和…...

springboot+vue使用EasyCaptcha实现简单验证码
一、实现效果 springboot使用EasyCaptcha实现简单验证码,更多api和用法可以去github上查看EasyCaptcha: Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。 二、实现步骤 1、导入依赖 <!-- easy-captcha --&g…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...