【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 都经过哪些步骤?

  1. 源代码:
Integer x = 5;
int y = 5;
boolean result = (x == y); // 这里比较 Integer 和 int
  1. Java 类型和自动拆箱:
    x 是一个 Integer 类型对象,而 y 是一个原始的 int 类型。
    在 x == y 的比较中,x 是一个对象,y 是一个基本类型(int)。Java 会进行 自动拆箱,将 Integer 对象 x 拆箱成 int 类型,然后进行基本类型的比较。
    自动拆箱的过程是通过 Integer 的 intValue() 方法完成的,因此 x.intValue() 会将 Integer 对象 x 中的值提取为 int 类型,然后与 y 进行比较。

  2. 编译后的字节码:
    假设这段代码已经被编译成字节码,我们可以查看相应的字节码操作。

字节码指令(假设以下字节码来自于 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)
  1. 字节码分析:
    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)。
  2. 拆箱过程:
    拆箱是 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。
  3. 结果:
    如果 x 和 y 的值相等,x.intValue() == y 会返回 true,字节码会执行 iconst_1,最终将 true 存储在 result 中。
    如果 x 和 y 的值不相等,字节码会执行 iconst_0,最终将 false 存储在 result 中。
  4. 总结:
    在字节码层面,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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot日志打印、SpringBoot集成Log4j2(附源码)、异步日志

文章目录 一、Log4j2介绍1.1、常用日志框架1.2、为什么选用log4j2 二、Log4j2整合步骤2.1、引入jar包2.2、配置文件2.3、配置文件模版 三、配置参数简介3.1、日志级别3.2、日志格式&#xff08;PatternLayout&#xff09;3.3、Appenders组件列表3.3.1、Console3.3.2、File3.3.3…

上传本地项目或文件到SVN服务器(图片讲解,超简单)

上传本地项目或文件到SVN服务器&#xff08;图片讲解&#xff0c;超简单&#xff09; 1、使用TortoiseSVN2、输入SVN远程仓库地址3、添加文件或文件夹 需求&#xff1a;将本地的文件上传到SVN服务器上指定路径。前提&#xff1a;已经安装好TortoiseSVN 1、使用TortoiseSVN 右…

使用 HEIC/HEIF 编码器将 HEIC 转换为 JPEG

随着iOS 11之后新的HEIF图像格式的发布&#xff0c;在当前几乎所有软件仅支持JPEG图像而不支持HEIC图像的环境下&#xff0c;这对Apple来说可能是一个巨大的挑战。不过&#xff0c;仍有一些方法可以为有需要的用户打开、查看、传输或转换iOS 11 HEIC 照片格式。本文将向您介绍 …

基于JAVA+SSM的教学资料管理系统

基于JAVASSM的教学资料管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈喽兄弟们&a…

stm32 移植RTL8201F(正点原子例程为例)

最近在工作中需要使用RTL8201F&#xff0c;在网上找了很多帖子&#xff0c;没有找到合适的&#xff0c;自己翻资料移植了一个。 模板工程使用的是正点原子的f407探索版的例程&#xff0c;原子使用的是LAN8720,需要把他的驱动修改成为我们自己用的RTL8201F。 1.将PHY_TYPE改成我…

RK3588+麒麟国产系统+FPGA+AI在电力和轨道交通视觉与采集系统的应用

工业视觉识别系统厂家提供的功能主要包括&#xff1a; 这些厂家通过先进的视觉识别技术&#xff0c;实现图像的采集、处理与分析。系统能够自动化地完成质量检测、物料分拣、设备监控等任务&#xff0c;显著提升生产效率和产品质量。同时&#xff0c;系统具备高度的灵活性和可扩…

Linux umami网站统计工具自定义API开发

Linux umami网站统计工具自定义API开发 一、src/queries/analytics/下添加调用sql查询文件&#xff1a;二、src/queries/index.js文件中增加导出模块内容&#xff1a;三、src/pages/api/下根据目录添加接口方法文件&#xff1a;四、构建项目&#xff0c;启动。1、到umami目录&a…

Meta 的新策略,将 AI 生成的角色整合到其社交媒体平台

一、Meta新年规划及引人注目的举措 多元规划背景&#xff1a;在新的一年&#xff0c;Meta制定了多维度的战略规划&#xff0c;旨在巩固并拓展其在科技领域的影响力。增强现实与元宇宙是其长期布局的重点方向&#xff0c;期望借此塑造未来互联网的交互形态&#xff1b;面对TikTo…

微信小程序滑动解锁、滑动验证

微信小程序简单滑动解锁 效果 通过 movable-view &#xff08;可移动的视图容器&#xff0c;在页面中可以拖拽滑动&#xff09;实现的简单微信小程序滑动验证 movable-view 官方说明&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.ht…

SWM221系列芯片之电机应用及控制

经过对SWM221系列的强大性能及外设资源&#xff0c;TFTLCD彩屏显示及控制进行了整体介绍后&#xff0c;新迎来我们的电控篇---SWM221系列芯片之电机应用及控制。在微控制器市场面临性能、集成度与成本挑战的当下&#xff0c;SWM221系列芯片以其卓越性能与创新设计&#xff0c;受…

软考教材重点内容 信息安全工程师 第 12 章网络安全审计技术原理与应用

12.1.1 网络安全审计概念 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作。网络安全审计的作用在于建立“事后”安全保障措施&#xff0c;保存网络安全事件及行为信息&#xff0c;为网络安全事件分析提供线索及证据&#xff0c;以便…

代码随想录算法训练营day21

代码随想录算法训练营 —day21 文章目录 代码随想录算法训练营前言一、669. 修剪二叉搜索树递归法迭代法 二、108.将有序数组转换为二叉搜索树递归法迭代法 三、538.把二叉搜索树转换为累加树递归法 总结 前言 今天是算法营的第21天&#xff0c;希望自己能够坚持下来&#xf…

Jetson系列部署YOLOv8模型教程

简介 NVIDIA Jetson系列是专为边缘计算设计的紧凑型计算模块&#xff0c;其目标用户为AI开发者、嵌入式系统工程师以及需要在设备端实时进行数据处理与AI推断的创新者。通过提供灵活的硬件平台&#xff0c;结合NVIDIA强大的GPU计算资源&#xff0c;Jetson系列能够支持复杂的机…

Python 3 与 Python 2 的主要区别

文章目录 1. 语法与关键字print 函数整数除法 2. 字符串处理默认字符串类型字符串格式化 3. 输入函数4. 迭代器和生成器range 函数map, filter, zip 5. 标准库变化urllib 模块configparser 模块 6. 异常处理7. 移除的功能8. 其他重要改进数据库操作多线程与并发类型注解 9. 总结…

word中编号统一格式

不要手敲编号&#xff0c;要利用工具来。要善于利用多级编号和编号&#xff0c;分别对标题和段落进行组织 尤其是段落和标题特别多的时候&#xff0c;像毕设、标书这些 为什么呢&#xff1f;因为这样更方便修改&#xff0c;后续的增加和删除段落&#xff0c;编号会自动排列&am…

MySQL8安装与卸载

1.下载mysql MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压mysql安装包 解压到自己定义的目录&#xff0c;这里解压就是安装&#xff0c;解压后的路径不要有空格和中文。 3.配置环境变量 配置环境变量可以方便电脑在任何的路径…

牛客网刷题 ——C语言初阶——JZ15 二进制中1的个数

1.题目描述 题目OJ链接 描述 输入一个整数 n &#xff0c;输出该数32位二进制表示中1的个数。其中负数用补码表示。 2.思路 求2进制中1的个数&#xff0c;可以转换为求每一位&#xff0c;1的个数&#xff0c;1&1还是1 所以判断如果该数值&1为真&#xff0c;我们就co…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签&#xff0c;只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上&#xff0c;增加新字段的需求。 实现方式有&#xff1a; &#xff08;1&…

十一、Vue 自定义指令详解

文章目录 一、自定义指令概念二、自定义指令的基本语法全局自定义指令局部自定义指令三、指令钩子函数bindinsertedupdatecomponentUpdatedunbind四、指令的参数传递简单参数传递动态参数传递五、自定义指令的应用场景权限控制动画效果第三方库集成六、自定义指令的双向绑定双向…

《Spring Framework实战》1:Spring简介

欢迎观看《Spring Framework实战》视频教程 Spring简介 目录 1. Spring简介 2. Spring项目 3. Spring 能做什么&#xff1f; Spring 使 Java 简单化。 Spring 使 Java 现代化。 Spring 使 Java 富有成效。 Spring 使 Java 反应性。 Spring 使 Java 轻松上云。 Sprin…