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

什么是字节码指令?[通俗易懂]字节码指令简介: 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【强化学习】GAIL生成对抗模仿学习详解《Generative adversarial imitation learning》

    【强化学习】GAIL生成对抗模仿学习详解《Generative adversarial imitation learning》通过深度强化学习,我们能够让机器人针对一个任务实现从0到1的学习,但是需要我们定义出reward函数,在很多复杂任务,例如无人驾驶中,很难根据状态特征来建立一个科学合理的reward。人类学习新东西有一个重要的方法就是模仿学习,通过观察别人的动作来模仿学习,不需要知道任务的reward函数。模仿学习就是希望机器能够通过观察模仿专家的行为来进行学习。OpenAI,DeepMind,Google…

    2022年9月19日
    6
  • 稀疏矩阵的十字链表存储的思路

    稀疏矩阵的十字链表存储的思路刚才终于完完全全、彻彻底底的搞明白了稀疏矩阵十字链表的存储方式的实现与该算法的思想。我觉得有必要把自己的思路记下来,一呢等自己将来忘记了可以回过头来看,二呢希望与我一样对该存储方式迷惑的朋友可以通过我的文章得到一点点的启示。现在进入正题。       我们知道稀疏矩阵的三元组

    2022年6月18日
    27
  • spring applicationContext.xml 配置文件 详解「建议收藏」

    spring applicationContext.xml 配置文件 详解「建议收藏」applicationContext.xml文件

    2022年7月26日
    6
  • 网络编程01_01是什么

    网络编程01_01是什么网络编程1.1概述网络编程的目的:信息传递,数据交换,通信。实现网络的条件:如何准确定位网络上的一台主机?IP地址+端口号定位到这台计算机上的某个资源找到了这个主机,如何传输数据?——硬件传输介质网络通信的规则:协议——UDP,TCP​ TCP/IP参考模型[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBe6VKUl-1639203769386)(…/image/01-16372424176942.png)]Javaweb——网页

    2022年8月9日
    8
  • python flask-mail 实现qq发送邮件[通俗易懂]

    python flask-mail 实现qq发送邮件

    2022年2月20日
    43
  • Java常用的几种属性拷贝工具类使用总结

    怕什么真理无穷,进一步有近一步的欢喜文章目录开头聊几句Java属性拷贝工具类使用总结字段和属性使用说明**org.springframework.beans.BeanUtils#copyProperties**org.apache.commons.beanutils.PropertyUtils#_copyProperties_org.apache.commons.beanutils.BeanUtils#_copyProperties原理探索Spring#BeanUtilsapache.commons#.

    2022年3月1日
    67

发表回复

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

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