Java虚拟机——字节码指令简介

news2024/10/4 22:23:50
  • Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码) 以及 跟随其后的零至多个代表此操作所需的参数(称为操作数)构成。
  • 大多数指令都不包括操作数,只有一个操作码,指令参数都存放在操作数栈中。
  • 劣势
  1. 字节码指令集,由于Java虚拟机操作码的长度为一个字节,这意味着指令集的操作码总数不能够超过256条。
  2. Class文件格式放弃了编译后代码的操作数长度对齐,这就意味着虚拟机在处理那些超过一个字节的数据时,不得不在运行时从字节中重建出具体数据的结构。
  • 优势
  1. 放弃了操作数长度对齐,就可以省略大量的填充和间隔符号。
  2. 用一个字节来代表操作码,尽可能获得短小精干的编译代码。

1. 字节码与数据类型

  • 在Java虚拟机的指令集中,大部分指令都包括其操作符对应的数据类型信息。
  1. iload指令:用于从局部变量表中加载int类型的数据到操作数栈中。
  2. fload指令:用于从局部变量表中加载float类型的数据到操作数栈中。
  • 对于大部分与数据类型相关的字节码指令,它们的操作码助记符中都有特殊的字符来表示专门为哪种数据类型服务。i代表int、s代表short、b代表byte、f代表float、a代表reference。
    在这里插入图片描述

2. 加载和存储指令

  • 加载和存储指令用于将数据在栈帧中的布局变量表和操作数栈之间来回传输。
    在这里插入图片描述

3. 运算指令

  • 算术指令对操作数栈上的两个值进行某种特定运算,并把结果重新存入到操作数栈顶。
  • 大体上运算指令可以分为 对整形数据的运算 和 对浮点型数据的运算
    在这里插入图片描述

4. 类型转换指令

  • 类型转换指令可以将两种不同的数值类型相互转换,这些转换操作一般用于实现用户代码中的显示类型转换操作。
  • Java虚拟机支持以下数值类型的宽化类型转换,即小范围向大范围类型的安全转换。
  1. int类型到long、float或者double类型
  2. long类型到float、double类型
  3. float类型到double类型
  • 反之,处理窄化类型转换时,就必须显示地使用转换指令来完成,这些转换指令包括i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l和d2f。
  • 但是窄化类型转化可能会导致转换结果产生不同的正负号、不同的数量级情况、转化过程可能导致数值的精度损失。 但是*中明确规定数据类型的窄化转换指令永远不可能导致虚拟机抛出运行时异常。

5. 对象创建与访问指令

  • 虽然类实例和数组都是对象,但是Java虚拟机为他们的创建与操作使用了不同的字节码指令。
  • 对象创建之后,就可以通过访问指令来获取对象实例 或者 数组实例中的字段或者数组元素。

6. 操作数栈管理指令

  • Java虚拟机也挺了一些直接用于操作操作数栈的指令
    在这里插入图片描述

7. 控制转移指令

  • 可以让Java虚拟机有条件或无条件地从指定位置指令的下一条指令继续执行程序。
  • 可以认为控制指令就是在条件或者无条件地修改PC寄存器的值。请添加图片描述

8. 方法调回和返回指令

  • 方法调用(分派、执行过程)在第8章具体介绍。
    在这里插入图片描述
  • 方法调用指令与数据类型无关,但是方法返回指令是根据返回值的类型区分的。 ireturn、lreturn、freturn、dreturn、areturn
  • 还有一条return指令,供声明为void的方法、实例初始化方法、类和接口的类初始化方法使用。

9. 异常处理指令

  • 在Java中显式抛出异常的操作都有athrow指令来实现。
  • 而在Java虚拟机中,异常处理(catch语句)不是由字节码指令来实现的,而是采用异常表来完成的。

10. 同步指令

  • Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步。 这两种同步结构都是使用锁来实现的。
  • 对于方法级的同步:不是通过字节码指令来控制的,它实现在方法调用和返回操作之中。虚拟机可以在方法表结构中的访问标志得到当前方法是否被声明为一个同步方法。
  • 同步一段指令序列:通常使用synchronized语句块来表示,Java虚拟机中用monitorenter和monitorexit两条指令来支持synchronized关键字的语义。

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

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

相关文章

ACL论文-系列2

文章目录 关系抽取——OD-RTE: A One-Stage Object Detection Framework for Relational Triple Extraction目标函数1——object 四个顶点概率目标函数2——span的概率总目标函数 Revisiting Relation Extraction in the era of Large Language ModelsCan NLI Provide Proper I…

TCP 协议简记 01 - TCP 包格式 连接管理

最近对 TCP 协议做了一次系统性的学习,种巨复杂的知识,只有系统性的总结归纳并且不断的实践才能够真正的掌握。后续会分为几篇文章来对 TCP 协议进行系统性的总结,帮助自己更好的理解 TCP 协议,也希望能够帮助到和我一样被 TCP 弄…

STM32MP157驱动开发——LED驱动(设备树)

文章目录 设备树驱动模型如何使用设备树写驱动程序设备树节点要与 platform_driver 能匹配设备树节点指定资源,platform_driver 获得资源 LED 模板驱动程序的改造:设备树驱动模型修改设备树,添加 led 设备节点修改 platform_driver 的源码编译…

【论文阅读】聚集多个启发式信号作为监督用于无监督作文自动评分

摘要 本文提出一个新的无监督的AES方法ULRA,它不需要真实的作文分数标签进行训练;ULRA的核心思想是使用多个启发式的质量信号作为伪标准答案,然后通过学习这些质量信号的聚合来训练神经自动评分模型。为了将这些不一致的质量信号聚合为一个统…

springboot 多数据源配置

1.引入相关pom文件 <!-- spring boot 启动 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><artifactId>log4j-api</artifactId&…

7.5Java EE——Bean的装配方式

一、基于XML的装配 两种基于XML的装配方式 在基于XML的装配就是读取XML配置文件中的信息完成依赖注入&#xff0c;Spring容器提供了两种基于XML的装配方式&#xff0c;属性setter方法注入和构造方法注入。下面分别对这两种装配方式进行介绍。 a.属性setter方法注入 属性sett…

Vuex 数据共享

文章目录 前言Vuex项目的创建state 配置项getters 配置项mutations 配置项actions 配置项 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 体现数据共享的概念 所有组件都可以使用那数据 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

时序数据库 TDengine 与金山云两大产品完成兼容互认证

万物互联时代&#xff0c;企业数字化转型和政企上云如火如荼。在云计算迎来重大发展机遇的同时&#xff0c;数据库在企业数字化转型中也扮演着重要的角色——随着业务量的激增&#xff0c;数据库的弹性扩容、容灾备份等需求逐渐显现&#xff0c;在此挑战下&#xff0c;时序数据…

前端学习记录~2023.7.17~CSS杂记 Day9

前言一、浮动1、使盒子浮动起来2、清除浮动3、清除浮动元素周围的盒子&#xff08;1&#xff09;clearfix 小技巧&#xff08;2&#xff09;使用 overflow&#xff08;3&#xff09;display: flow-root 二、定位1、定位有哪些2、top、bottom、left 和 right3、定位上下文4、介绍…

jupyter notebook更换虚拟环境(内核)

jupyter notebook更换虚拟环境&#xff08;内核&#xff09; 创建一个新的虚拟环境 # stk_env 虚拟环境的名字&#xff0c;任取。 conda create -n stkenv python3.9激活虚拟环境 conda activate stkenv安装ipykernel # 为该虚拟环境&#xff0c;安装内核。 conda install -c a…

rabbitmq模块启动报java.net.SocketException: socket closed的解决方法

问题 最近在接手一个项目时&#xff0c;使用的是spring-cloud微服务构架&#xff0c;mq消息消费模块是单独一个模块&#xff0c;但启动这个模块一直报如下错误&#xff1a; java.net.SocketException: socket closed 这个错误是这个模块注册不到nacos报的错&#xff0c;刚开…

FCOS 论文学习

1. 解决了什么问题&#xff1f; 之前的目标检测器如 RetinaNet、SSD、YOLOv3 都依赖于 anchors。基于 anchors 的检测器有如下三个缺点&#xff1a; 检测表现对于 anchors 的大小、宽高比和数量等超参数很敏感&#xff1b;即使精心设计了 anchors&#xff0c;但由于大小和宽高…

架构训练营学习笔记:4-2 存储架构模式之复制架构

高可用的关键指标 问题&#xff1a;分为故障跟灾难。不是有了多活架构就不在用复制架构 &#xff0c;还是之前的合适原则&#xff1a;多活架构的技术复杂度 跟成本都比复制架构高。 高可用的关键指标 恢复时间目标(RecoveryTimeObjective&#xff0c;RTO)指为避免在灾难发生后…

rabbitmq部署(docker方式)

前言&#xff1a;rabbitmq一旦有漏洞&#xff0c;版本升级麻烦&#xff0c;于是改为docker部署 环境&#xff1a;centos7 #停掉之前的服务 systemctl stop rabbitmq-server systemctl disable rabbitmq-server 查了官网&#xff0c;当前3.11.x 最高版本是3.11.19, 虽然3.12…

【开源分享】在线客服系统源代码-thinphp网站在线客服系统源码(附源码完整搭建教程)...

本文的核心是一个多国语言在线客服聊天系统源码。我们将在这里保持非常简单。 这是一款旧版本的PHP客服源码。 基于ThinkPHP5 workerman&#xff0c;整体架构比较老&#xff0c;PHP客服端以及界面等需要在php-fpm下运行&#xff0c;即时通讯websocket服务端需要命令行执行。 源…

N-gram模型学习

网上有很多比较细节比较复杂比较清晰的介绍&#xff0c;我这里就不再细细的描述了&#xff0c;之前看文献的时候看到了这个模型&#xff0c;脑子里又没有印象&#xff0c;结果发现是python的学习范畴。 总的来说&#xff0c;这是一种文字&#xff0c;甚至可以上升到符号关联性…

基于Python的工业图像异常检测基础技术详解

引言 博文字数7000&#xff0c;建议阅读时间20分钟。 这篇博客对当前几种典型的图像异常检测算法进行了比较&#xff0c;包括Kmeans、Kmeans以及大津法&#xff08;OTSU&#xff09;&#xff0c;并给出了相关的代码实现与测试方法。总结的比较结果如下表所示&#xff1a; 方…

cocosCreator 3.6以上接入腾迅Bugly 捕捉JS错误 Android

cocosCreator3.6以上接入Bugly上报其实很简单&#xff0c;不需要网上那么多弯弯绕&#xff0c;三须三步走。 1. 按照官网方式接入android的bugly 2. android端写一个Bugly上报管理类 3. 修改你工程目录下native\engine\common\Classes\目录下的Game.h, Game.cpp两个文件&…

发电厂主厂房智能照明控制系统的设计和应用

摘要&#xff1a;当前&#xff0c;电厂主厂房的照明规模较大&#xff0c;而且具有许多回路&#xff0c;增加了电厂照明负荷&#xff0c;导致照明过程中的能源消耗较高。对此&#xff0c;电厂需要合理设计智能照明系统&#xff0c;运用智能技术提高电厂照明的运行管理水平&#…

如何在化工行业运用IPD?

化工行业作为国民经济的重要基础性行业&#xff0c;包含数以万计的产品种类&#xff0c;各具有不同的物理化学特性。化工产品的消费同国民经济状况联系非常紧密&#xff0c;主要去向广泛分布于基建、房地产、农业、汽车、服装等国民经济各个领域。按应用领域划分&#xff0c;典…