什么是字节码指令?[通俗易懂]

什么是字节码指令?[通俗易懂]字节码指令简介: Java虚拟机的指令由一个字节长度的、代表着某种特定含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。由于限制了Java虚拟机操作码的长度为一个字节,所以指令集的操作码总数不可能超过256条。字节码与数据…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

字节码指令简介: 
Java虚拟机的指令由一个字节长度的、代表着某种特定含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。 由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。由于限制了Java虚拟机操作码的长度为一个字节,所以指令集的操作码总数不可能超过256条。

字节码与数据类型:大部分与数据类型相关的字节码指令,他们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表int,l代表long,s代表short等等。大部分指令都没有支持整型类型****byte、char和short以及boolean类型。编译器会在编译器或运行期将byte和short类型的数据带符号扩展为相应的int类型,将boolean和char类型数据零位扩展为相应的int类型数据。与之类似在操作boolean、byte、short和char类型的数组时,也会转换为只用对应的int类型的字节码指令来处理。因此大多数对于上述类型数据的操作,实际上都是使用相应的int类型作为运算类型。

加载和存储指令助记符: 
加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。 
load将一个局部变量加载到操作栈:iload、lload、fload等。 
store将一个数值从操作数栈存储到局部变量表:istore、lstore、fstore等。 
将一个常量加载到操作数栈:bipush、sipush、ldc等

运算指令助记符: 
加法指令:iadd、ladd、fadd、dadd 
减法指令:isub、lsub、fsub、dsub 
等等。

在Java虚拟机规范中定义了在除法指令(idiv和ldiv)以及求余指令(irem和lrem)中当出现除数为零时会导致虚拟机抛出ArithmeticException,其余整型运算场景都不应该抛出运行时异常。

类型转换指令: 
Java虚拟机直接支持以下数值类型的宽化类型转换: 
int类型到long、float或者double 
long类型到float、double 
float类型到double 
相对的,处理窄化类型转换时,必须显示的使用转换指令来完成,这些转换指令包括:i2b、i2c、l2i、f2i、d2i等等

对象创建与访问指令: 
创建类实例的指令:new 
创建数组的指令:newaray、anewarray 
访问类字段(static字段)和实例字段(非static字段)的指令:getfield、putfield、getstatic、putstatic 
把一个数组元素加载到操作数栈的指令:baload、caload、saload、iaload等等 
将操作数栈的值存储到数组元素中的指令:bastore、castore、sastore、iastore等等 
查数组长度的指令:arraylength 
检查实例类型的指令:instanceof、checkcast

操作数栈管理指令: 
将操作数栈顶一个或两个元素出栈:pop、pop2 
复制栈顶一个或两个数值将复制值或者双份的复制值重新压如栈顶:dup、dup2 
将栈最顶端的两个数值互换:swap

控制转移指令: 
控制转移指令可以让Java虚拟机有条件或无条件的从指定的位置执行而不是控制转移指令的下一条指令继续执行程序, 
可以认为控制转移指令就是在有条件或无条件的修改PC寄存器的值。 
条件分支:ifeq、ifnull等 
无条件分支:goto、goto_w、jsr、ret

方法调用和返回指令: 
invokevirtual指令:用于调用对象的实例方法。 
invokeinterface指令:用于调用接口方法,他会在运行时搜索一个实现了这个接口的对象,找出适合的方法进行调用。 
invokespecial指令:用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。 
invokestatic指令:用于调用类方法(static方法)。

异常处理指令: 
在Java程序中显示抛出异常的操作(throw)都有athrow指令来实现,除了用throw语句显示抛出异常情况之外,Java虚拟机规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。例如,在整数运算中,当除数为零时,虚拟机会抛出ArithmeticException异常。在Java虚拟机中,处理异常(catch)不是由字节码来实现的,而是采用异常表(Code属性中)完成的。

同步指令: 
Java的同步分为方法级同步和方法内部一段指令序列同步(部分代码),这两种同步结构都是使用管程(Monitor)来支持的。 
方法级的同步:无需通过字节码指令来控制,他的实现在方法调用和方法返回中,虚拟机能通过Class结构表中通过方法表结构中的access_flags中的ACC_SYNCHRONIZED标志得知一个方法是否声明为同步方法。当方法调用时,调用指令将会检查方法的该标志位是否被设置了,如果为真,执行线程就要先成功持有管程,然后才能执行方法,最后当方法完成时(无论是正常完成还是非正常)释放管程。在方法执行期间,执行线程持有了管程,其他任何线程都无法再获得到管程,如果一个同步方法执行期间抛出了异常,并且在方法内部无法处理此异常,那么这个同步方法所持有的管程将在异常抛出到同步方法之外是自动释放。

指令集序列同步(部分代码同步):Java虚拟机使用monitorenter和monitorexit两条指令来支持synchronized关键字的语义。在执行代码前有monitorenter开始同步,在执行完代码退出以前有monitorexit退出同步。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184758.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2019-1024杂记「建议收藏」

    今天1024,程序员的节日。这个节日对我来说从陌生到熟悉,在到自己成为节日的“主角”。想到自己选择的工作,程序员的工作,有时候真的是自己想干的嘛,其实我也不知道。由于历史的某个偶然的选择,成就了当下的必然结果。当下的某个选择,又会影响未来的发展。被时间裹挟向前一年复一年…

    2022年2月28日
    41
  • oracle hint中ordered 和leading原理很好的帖子

    oracle hint中ordered 和leading原理很好的帖子问题 请教 HINT 写法我有一个 SQL 添加如下 hint 目的是指定 hash join 方式 select ordereduse hash a b c d Froma b c dWhere 其中 nbsp nbsp nbsp nbsp a 只与 b 有关联关系 b 只与 c 有关联关系 b 只与 c 有关联关系 c 只与 d 有关联关系 nbsp nbsp 数量级 a 1000 条 nbsp nbsp b 100

    2025年7月4日
    0
  • 快速入门UML时序图「建议收藏」

    快速入门UML时序图「建议收藏」使用UML时序图重构代码使用UML时序图时序图是什么时序图的元素组合块(CombinedFragment)举例使用UML时序图最近,在重构项目中的老代码的时候,业务复杂,文档缺失。抽丝剥茧,沉迷在剪不断理还乱的纷繁的关系中,像是苏东坡诗中的那只高贵的乌鸦先生找不到落脚之处。披沙拣金,终于理出一点头绪,生怕忘了,赶紧记下来,又苦于没有好的方式去表达这些错杂的关系,蓦然发现,UML时序图是表达业…

    2022年6月29日
    34
  • notepad正则删除关键词所在行

    notepad正则删除关键词所在行

    2021年7月19日
    77
  • java 调用webservice asmx「建议收藏」

    java 调用webservice asmx「建议收藏」用的jar包axis,可以在http://download.csdn.net/download/xiaoyong8823/4391971这里下载因为最近有个项目要调用webservice接口,之前接触的都是Java开发服务端和客户端的接口,开发前服务端一般会给个以http://xxx/services?wsdl地址的文件或者地址。这次对方给我个http://xxxx/serv

    2022年6月1日
    35
  • 数学建模13种常见方法

    数学建模13种常见方法下面来介绍一下数学建模大赛中常用的13中建模方法:1、层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨蒂于20世纪70年代初,在为美国国防部研究"根据各个工业部门对国家福利的贡献大小而进行电力分配"课题时,应用网络系统理论和多目标综合评价方法,提出的一种层次权重决策分析方法。2、多…

    2022年9月24日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号