【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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 及 GitHub Desktop 详细使用教程(通俗易懂)

目录 Δ前言 一、Github教程 1.什么是Github&#xff1f; 2.仓库和对仓库的操作&#xff1a; 2.1 Repository&#xff08;仓库&#xff09; 2.2 Fork&#xff08;派生&#xff09; 2.3 Star&#xff08;收藏&#xff09; 2.4 Watch&#xff08;追番&#xff09; 2.5 Issue&am…

OpenLinkSaas使用手册-待办事项和通知中心

在OpenLinkSaas工作台上&#xff0c;你可以查看待办事项和未读通知。 待办事项 目前待办事项支持: 个人待办项目待办:在项目中指派给你的任务/缺陷Git待办:在Git仓库中指标给你的Issue,目前只有在AtomGit和Gitee账号登录时才支持。 通知中心 通知中心支持Git通知和邮件通知两种…

springboot集成阿里云短信服务

springboot集成阿里云短信服务 一.阿里云账号准备 流程:注册阿里云账号>短信服务>新增资质>新建签名>新建模版>申请秘钥>用代码测试 1.注册阿里云账号 2、登录成功后&#xff0c; ① 在首页搜索短信服务 ② 打开第一个搜索结果 ③ 免费开通 ④ 可以根据…

试题转excel;word转excel;大风车excel(1.1更新)

最近更新了大风车excel1.1版本 主要优化在算法层面&#xff1a; 1.0版本试题解析的成功率为95%&#xff0c;现在1.1版本已经优化到解析成功率为99% 一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道…

python实现自动登录12306抢票 -- selenium

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码&#xff0c;但是都不是最新的&#xff0c;我也是从网上找别人的帖子&#xff0c;看B站视频&…

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型 目录 机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型1 过拟合和欠拟合1.1 过拟合1.2 欠拟合 2 正则化惩罚2.1 概念2.2 函数2.3 正则化种类 3 K折交叉验证3.1 概念3.2 图片理解3.3 函数导入3.4 参数理解 4 训练模型K折交…

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…

《Vue3实战教程》37:Vue3生产部署

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 生产部署​ 开发环境 vs. 生产环境​ 在开发过程中&#xff0c;Vue 提供了许多功能来提升开发体验&#xff1a; 对常见错误和隐患的警告对组件 props / 自定义事件的校验响应性调试钩子开发工具集成 然而&#xff…

python制作打字小游戏

import pygame # 导入游戏模块 安装pygame import sys # 导入系统指令模块 import random # 导入随机数模块 pygame.init() #初始化游戏环境 wndpygame.display.set_mode((800,565)) #指定窗口大小 pygame.mixer.music.load(素材/SurvivalGame.mp3) #素…

抖音短视频矩阵系统源码开发全流程解析

在项目开发过程中&#xff0c;调整配置文件至关重要&#xff0c;这些文件包括数据库连接、API密钥及全局参数等。通过正确配置这些信息&#xff0c;可确保应用程序的稳定性和安全性。灵活调整配置以适应具体需求有助于短视频矩阵系统项目的顺利推进。 在开发环境中&#xff0c…

前端路由layout布局处理以及菜单交互(三)

上篇介绍了前端项目部署以及基本依赖的应用&#xff0c;这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举

本篇博客将聚焦于通过递归来实现两种经典的枚举方法&#xff1a;指数型枚举和排列型枚举。这两种枚举方式在计算机科学和算法竞赛中都有广泛应用&#xff0c;无论是在解题中&#xff0c;还是在实际工作中都极具价值。 目录 前言 斐波那契数列递归 递归实现指数型枚举 算法思…

idea 的 springboot项目spring-boot-devtools 自动编译 配置热部署

1&#xff0c;设置一 2&#xff0c;设置二 设置二&#xff08;旧版本&#xff09; CtrlShiftAlt/ 点击弹出框中Registry... 引入&#xff08;如果报错&#xff0c;换不同的版本&#xff09; <dependency><groupId>org.springframework.boot</groupId><a…

低代码开发:开启企业数智化转型“快捷键”

一、低代码开发浪潮来袭&#xff0c;企业转型正当时 在当今数字化飞速发展的时代&#xff0c;低代码开发已如汹涌浪潮&#xff0c;席卷全球。从国际市场来看&#xff0c;诸多企业巨头纷纷布局低代码领域&#xff0c;像微软的 PowerApps、OutSystems 等平台&#xff0c;凭借强大…

C#二维数组详解

目录 1&#xff0c;什么是二维数组&#xff1f; 2&#xff0c;创建二维数组的几种方式 &#xff08;1&#xff09;使用[,]声明数组&#xff08;常见方式&#xff09; &#xff08;2&#xff09;声明数组时指定元素 &#xff08;3&#xff09;使用new创建数组 &#xff08;…

STM32--超声波模块(HC—SR04)(标准库+HAL库)

一、HC-SR04工作原理 1&#xff09;采用IO触发测距&#xff0c;给至少10us的高电平信号。 2&#xff09;模块自动发送8个40KHz的方波&#xff0c;自动检测是否有信号返回。 3&#xff09;有信号返回&#xff0c;通过IO输出一高电平&#xff0c;高电平持续时间就是超声波从发…

DDD(一)—— Authentication with JWT

文章目录 项目地址一、项目结构梳理1.1 Domain层1.1.1 Entities文件夹1.2 Contracts层1.2.1 Authentication文件夹1.3 Appliaction层1.3.1Common文件夹1. Interfaces文件夹Authentication 权限接口Persistence 数据库接口Services 常用服务接口1.3.2 Services文件夹1. Authenti…

GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网

记录一些平时接触到的 GPU 知识。由于是笔记而非教程&#xff0c;因此内容不求连贯&#xff0c;有基础的同学可作查漏补缺之用 1 术语与基础 1.1 PCIe 交换芯片1.2 NVLink 定义演进&#xff1a;1/2/3/4 代监控1.3 NVSwitch1.4 NVLink Switch1.5 HBM (High Bandwidth Memory) 由…

自由学习记录(31)

Java连接MySQL 找到那个关键jar包然后导入选中&#xff0c;就配置好MySQL的JDBC&#xff08;Java Database Connectivity&#xff09;了 菜单--文件--项目结构 项目设置--模块--选择要附着的项目--选择依赖--选中模块源--选中加号添加jar包 解压之后在里面可以看到这个最关键…