Java字节码指令

news2024/11/13 11:01:18

 Java代码运行的过程是Java源码->字节码文件(.class)->运行结果。

Java编译器将Java源文件(.java)转换成字节码文件(.class),类加载器将字节码文件加载进内存,然后进行字节码校验,最后Java解释器翻译成机器码。

图 Java编译过程

1 字节码简介

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的0至多个代表此操作所需的参数(称为操作数,Operand)构成。

1.1 一个字节长度的操作码

缺点:

1)一个字节(0~255),这意味着指令集的操作码总数不能超过256条。

2)由于Class文件格式放弃了编译后代码的操作数长度对齐,这意味着虚拟机在处理那些超过一个字节的数据时,不得不在运行时从字节中重建出具体的数据结构。

图 操作数对齐与不对齐情况下存储char的情况

当不对齐时,存储一个char类型(占2个字节),需要用两个无符号字节存储起来,则值为: (byte1 << 8) | byte2。 当对齐时直接表示为:byte0。所以不对齐时,这种操作某种程度上会导致解释器执行字节码时损失些性能。

优点:

1)放弃操作数长度对齐,就意味着可以省略掉大量的填充和间隔符号。

2)用一个字节来代表操作码,也是为了尽可能获得短小精干的编译代码。

1.2 执行模型

如果不考虑异常处理的话,那Java虚拟机的解释器可以使用以下这段伪代码作为最基本的执行模型来理解:

do {

    PC寄存器的值+1;

            根据P C寄存器指示的位置,从字节码流中取出操作码;

            if (字节码存在操作数) 从字节流中取出操作数;

            执行操作码所定义的操作;

  } while (字节码流长度 > 0 );

1.3 异常表

在Java虚拟机中,处理异常不是由字节码指令来实现,而是采用异常表来完成的。

异常表(exception_table)是存储于属性表(attribute_info)中的Code属性表中的一个结构,这个结构是可选的。

类型

名称

数量

说明

u2

start_pc

1

try的范围的起始位置。

u2

end_pc

1

try的范围的终止位置。

u2

handler_pc

1

出现类型为catch_type或者其子类的异常,则跳转到第handler_pc行执行。

u2

catch_type

1

异常类型,是指向一个CONSTANT_Class_info型常量的索引。如果为0,表示任意异常情况都需要转到handler_pc处进行处理。

表 异常表的结构

当程序触发异常时,JVM会从上至下遍历异常表中的所有条目。当触发异常的字节码索引值在某个异常表条目的监控范围内,JVM会判断所抛出的异常和该条目的catch_type是否匹配,如果匹配,JVM会将控制流转移至该条目的handle_pc所指向的位置。如果遍历完所有异常表条目,JVM仍未匹配到异常处理器,那么它会弹出当前方法对应的Java栈帧,并在调用者中重复上诉操作。

2 字节码指令

2.1 字节码与数据类型

在Java虚拟机的指令集中,大多数指令都包含其操作对应的数据类型信息。a代表reference。

iload指令用于从局部变量表中加载int型的数据到操作数栈中。而fload指令加载到则是float类型的数据。

大部份指令都没支持byte、char和short,甚至没有任何指令支持boolean类型。编译器会在编译器或运行期将byte和short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为相应的int类型数据。

2.2 加载和存储指令

将一个局部变量加载到操作栈:iload、iload_<n>、lload;

将一个数值从操作数栈存储到局部变量表:istore、istore_<n>、astore;

将一个常量加载到操作数栈:bipush、sipush、ldc、ldc_w、iconst_ml;

扩充局部变量表的访问索引的指令: wide;

以尖括号结尾的(例如iload_<n>),这些指令助记符实际上代表了一组指令(例如iload_<n>,它代表了iload_0、iload_1)。

2.3 运算指令

加法指令

iadd、ladd、fadd

减法指令

isub、lsub

乘法指令

imul、lmul

除法指令

idiv、ldiv、fdiv

求余指令

irem、lrem、frem、drem

取反指令

ineg、lneg、fneg

位移指令

ishl、ishr

按位或指令

ior、lor

按位与指令

iand、land

按位异或指令

ixor、lxor

局部变量自增指令

iinc

比较指令

dcmpg、dcmpl、fcmpg

表 算术指令

不存在直接支持byte、short、char和boolean类型的算术指令。对于这些数据类型,应使用操作int类型的指令代替。

2.4 类型转换指令

类型转换指令可以将两种不同的数值类型相互转换,这种转换一般用于实现用户代码中的显式类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。

这些转换指令包括:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l和d2f。

2.5 对象创建和访问指令

创建类实例

new

创建数组

newarray、anewarray、multianewarrray

访问类字段和实例字段

getfield、putfield、getstatic、putstatic

把一个数组元素加载到操作数栈

baload、caload、iaload…

将一个操作数栈的值存储到数组元素

bastore、iastore

取数组长度

arraylength

检查类实例类型

instanceof、checkcast

表 对象创建与访问指令

2.6操作数栈管理指令

将操作数栈到栈顶一个或两个元素出栈:pop、pop2;

复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2;

将栈最顶端的两个数值互换:swap

2.7 控制转移指令

控制转移指令可以让Java虚拟机有条件或无条件地从指定位置指令(而不是控制转移指令)的下一条指令继续执行程序,从概念模型上理解,可以认为控制指令就是在有条件或无条件地修改PC寄存器地值,控制转移指令包括:

条件分支:ifeq、iflt…

复合条件分支:tableswitch、lookupswitch

无条件分支:goto、goto_w、jsr、jsr_w、ret

各种类型的比较最终都会转化为int类型的比较操作。

2.8 方法调用和返回指令

invokevirtual指令:用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派)。

invokeinterface指令:用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出合适的方法进行调用。

invokespecial指令:用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。

invokestatic指令:用于调用类静态方法。

invokedynamic指令:用于在运行时动态解析出调用点限定符所引用的方法。并执行该方法。

方法调用指令与数据类型无关,而方法返回指令是根据返回值的类型区分的。包括ireturn、lreturn、freturn、dreturn和areturn。return指令为void的方法。

2.9 异常处理指令

在Java程序中显式抛出异常的操作(throw语句)都由athrow指令来实现。处理异常不是由字节码指令来实现的,而是采用异常表。

2.10 同步指令

Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor,也称为锁)来实现的。

方法级的同步是隐式的,无须通过字节码指令来控制。

同步一段指令集序列通常是由Java语言中的synchronized语句来表示的,Java虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第六届中国软件开源创新大赛——飞桨赛题新鲜出炉,速来pick!

最近想要充个电&#x1f50b; 飞桨邀你开启开源贡献之旅 寻找那个最“会”的你 顶级开源项目、资深研发指导、高阶开发者合作交流&#xff0c;‍‍ Buff 叠满&#xff01; 技能提升、丰富简历、高额奖金&#xff0c; 你还不心动&#xff1f; 赛事简介 中国软件开源创新大赛已成…

聊聊StarRocks向量化执行引擎-过滤操作

聊聊StarRocks向量化执行引擎-过滤操作 StarRocks是开源的新一代极速MPP数据库&#xff0c;采用全面向量化技术&#xff0c;充分利用CPU单核资源&#xff0c;将单核执行性能做到极致。本文&#xff0c;我们聊聊过滤操作是如何利用SIMD指令进行向量化操作。 过滤操作的SIMD向量化…

值得拥有的一篇SpringBoot入门基础指南

目录 一. 创建SpringBoot项目1.1 使用Spring Initializr快速构建项目1.2 手动创建springboot项目 二. SpringBoot入门案例解析2.1 依赖管理特性2.2 starter场景启动器2.3 引导类自动配置 三. REST风格四. 配置文件 一. 创建SpringBoot项目 1.1 使用Spring Initializr快速构建项…

「数据架构」MDM实现失败的主要原因

我经常参与一个组织的MDM程序&#xff0c;当他们在一个失败的项目之后向InfoTrellis请求帮助进行清理&#xff0c;或者开始尝试X&#xff0c;以实现对某些人来说非常困难的目标时。主数据管理实现失败的原因有很多&#xff0c;但是没有一个是由于在这些场景中使用的责备游戏的原…

【Redis】Redis缓存

目录 一、缓存 1、概念 2、作用 3、缺点 二、缓存模型 三、缓存的更新 1、更新策略 2、主动更新的三种模式 1.cache aside pattern 2.read/write through pattern 3.write behind caching pattern 3、线程安全问题 1.缓存删除还是更新缓存 2.先删除缓存后操作数据…

英特尔让谷歌云破解其新的安全芯片并发现多个漏洞

谷歌云和英特尔在24日发布了对英特尔新硬件安全产品 Trust Domain Extensions (TDX)为期九个月的审计结果。 该分析揭示了 10 个已确认的漏洞&#xff0c;其中两个被两家公司的研究人员标记为重要漏洞&#xff0c;以及五个导致主动更改以进一步加强 TDX 防御的发现。 检查和修…

FPGA中有限状态机的状态编码采用格雷码还是独热码?

有限状态机是由寄存器组和组合逻辑构成的硬件时序电路&#xff0c;其状态&#xff08;即由寄存器组的1和0的组合状态所构成的有限个状态&#xff09;只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态&#xff0c;究竟转向哪一状态还是留在原状态不但取决于各个输入…

HAProxy负载均衡架构

目录 一、HAProxy简介1.Haproxy应用分析2.HAProxy的主要特性3.HAProxy常用的负载均衡策略4.LVS、Nginx、HAproxy的区别 二、Haproxy搭建 Web 群集1.haproxy 服务器部署2.编译安装 Haproxy3.Haproxy服务器配置4.添加haproxy 系统服务5.节点服务器部署6.启动haproxy服务7.日志定义…

LIST、SET、Queue

Java 集合概览Java 集合&#xff0c; 也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Collection 接口&#xff0c;下面又有三个主要的…

CloudCompare比较点云并统计特定距离误差范围内的点数

文章目录 1.导入点云2.旋转或平移某个点云3.配准点云3.点云差异比较4.统计特定误差范围内的点云数量 1.导入点云 点击文件夹图标&#xff0c;选择要导入到CC&#xff08;CloudCompare&#xff09;处理的两个点云&#xff0c;最终可看到点云目录树&#xff1a; 2.旋转或平移某个…

配置出接口方式的单服务器智能DNS

组网需求 如图1所示&#xff0c;企业部署了一台ISP1服务器对外提供Web服务&#xff0c;域名为www.example.com。ISP1服务器的私网IP地址为10.1.1.10&#xff0c;服务器映射后的公网IP地址为1.1.1.10。企业的DNS服务器上存在域名www.example.com与ISP1服务器地址1.1.1.10的对应关…

如何在微服务下保证事务的一致性 | 京东云技术团队

作者&#xff1a;京东科技 苗元 背景 随着业务的快速发展、业务复杂度越来越高&#xff0c;传统单体应用逐渐暴露出了一些问题&#xff0c;例如开发效率低、可维护性差、架构扩展性差、部署不灵活、健壮性差等等。而微服务架构是将单个服务拆分成一系列小服务&#xff0c;且这…

静态分析和动态分析

在开发早期&#xff0c;发现并修复bug在许多方面都有好处。它可以减少开发时间&#xff0c;降低成本&#xff0c;并且防止数据泄露或其他安全漏洞。特别是对于DevOps&#xff0c;尽早持续地将测试纳入SDLC软件开发生命周期是非常有帮助的。 这就是动态和静态分析测试的用武之地…

如何在 Ubuntu 20.04 系统上安装 Docker方法和使用

0. docker的例子&#xff0c;ubuntu中运行docker例子应用 1.首先对docker环境进行安装&#xff0c;我这里是ubuntu20.04的系统&#xff0c;进行演示&#xff0c;更新 apt 包索引 sudo apt update2.安装依赖包 sudo apt install apt-transport-https ca-certificates curl gn…

BatteryChargingSpecification1.2中文详解

1. Introduction 1.1 Scope 规范定义了设备通过USB端口充电的检测、控制和报告机制&#xff0c;这些机制是USB2.0规范的扩展&#xff0c;用于专用 充电器&#xff08;DCP&#xff09;、主机(SDP)、hub(SDP)和CDP(大电流充电端口)对设备的充电和power up。这些机制适用 于兼…

从校园跑腿系统看当代青年的消费观念与行为习惯

当代大学生的消费观念和行为习惯正在发生着巨大的变化&#xff0c;他们越来越注重方便、快捷和贴近自己的消费体验。在这一背景下&#xff0c;校园跑腿系统应运而生&#xff0c;成为了解决学生日常生活中烦恼的新选择。 ​校园跑腿系统是一款基于互联网技术、致力于提供高效、…

做好韩语同声传译,译员需要具备这些能力!

我们知道&#xff0c;同声传译是口译的高级形式&#xff0c;难度比较大&#xff0c;对译员的综合能力要求非常高。那么&#xff0c;针对同声传译的韩语翻译&#xff0c;译员需要具备什么条件&#xff0c;如何翻译效果比较好&#xff1f; 据了解&#xff0c;韩语同声传译是一项高…

会声会影2023最新中文旗舰版新功能介绍

会声会影Corel VideoStudio2023一款功能丰富的视频编辑软件。具有拖放式标题、转场、覆叠和滤镜&#xff0c;色彩分级、动态分屏视频和新增强的遮罩创建器&#xff0c;超越基本编辑&#xff0c;实现影院级效果。优化分屏剪辑功能&#xff0c;简化多时间轴编辑的工作流程&#x…

数字硬件建模SystemVerilog-通信总线建模 --Interface和modport

来到了SV最后一部分&#xff0c;预计三篇文章&#xff0c;两周更完&#xff0c;所有的思维导图如下&#xff1a; 概述 SystemVerilog Interface是modport的一种&#xff0c;但比简单的输入、输出或输入输出端口的功能更多。在其最简单的形式中&#xff0c;Interface端口将相关的…

使用Tailwind CSS创建自定义动画,进阶您的前端开发技能

从零开始&#xff0c;探索如何使用 TailwindCSS 自定义动画 Tailwind CSS是一种颠覆性的CSS框架&#xff0c;改变了开发者处理前端开发的方式。它的低级性和移动优先的方法使得它成为设计独特、响应式和可扩展的网页设计的热门选择。此外&#xff0c;它还具有强大的动画支持&am…