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

  • 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关键字的语义。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】k8s安全机制

前言 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介, 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。 比如 kubectl 如果想向 API…

记一次真实MySQL百万数据优化

证实下确实是150万+数据哈 原SQL 原SQL执行计划 原SQL执行时间 5秒左右 原SQL分析 思路来源 整体看下SQL好像没啥可优化的。那咱们就大错特错了。 可能有人会说B表为啥在A表后面不正常呀,因为这是内连接查询不是左右连接查询。A,B表的顺序是可以交换的(实测无影响) 首先我们…

JVM之内存与垃圾回收篇2

文章目录 3 运行时区域3.1 本地方法栈3.2 程序计数器3.3 方法区3.3.1 Hotspot中方法区的演进3.3.2 设置方法区内存大小3.3.3 运行时常量池3.3.4 方法区使用举例3.3.5 方法区的演进3.3.5 方法区的垃圾回收 3.4 栈3.4.1 几个面试题 3.5 堆3.5.1 Minor GC、Major GC和Full GC3.5.2…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 ,正则表达式 包括子目录 ls 不包括 子目录 如果省略路径,表示 在当前路径下,搜索 软链接…

Python爬虫——urllib_微博cookie登陆

cookie登陆适用场景: 适用场景:数据采集的时候,需要绕过登陆,然后进入到某个页面 # 适用场景:数据采集的时候,需要绕过登陆,然后进入到某个页面 import urllib.requesturl https://weibo.cn/7…

Linux 学习记录52(ARM篇)

Linux 学习记录52(ARM篇) 本文目录 Linux 学习记录52(ARM篇)一、汇编语言相关语法1. 汇编语言的组成部分2. 汇编指令的类型3. 汇编指令的使用格式 二、基本数据处理指令1. 数据搬移指令(1. 格式(2. 指令码类型(3. 使用示例 2. 立即数(1. 一条指令的组成 3. 移位操作指令(1. 格式…

Revit中如何创建水的效果及基坑?

一、Revit中如何创建水的效果? 我们在创建建筑的时候会遇上小池塘啊小池子之类的装饰景观,Revit又不像专业的3D软件那样可以有非常真实的水的效果,那么我们该如何简单创建水呢?下面来看步骤: 1、 在水池位置创建一块楼板,并将该…

【DevOps】Atlassian插件开发指南

本文以Bamboo插件开发为例,记录一下插件开发过程。 一、简介 Atlassian Bamboo 6.9.1 是一款持续集成和持续交付(CI/CD)工具,支持使用插件扩展其功能。如果需要开发自己的 Bamboo 插件并添加到 Bamboo 中,则可以参考…

sqli-labs 堆叠注入 解析

打开网页首先判断闭合类型 说明为双引号闭合 我们可以使用单引号将其报错 先尝试判断回显位 可以看见输出回显位为2,3 尝试暴库爆表 这时候进行尝试堆叠注入,创造一张新表 ?id-1 union select 1,database(),group_concat(table_name) from informatio…

mac端好用的多功能音频软件 AVTouchBar for mac 3.0.7

AVTouchBar是来自触摸栏的视听播放器,将跳动笔记的内容带到触摸栏,触摸栏可显示有趣的音频内容,拥有更多乐趣,以一种有趣的方式播放音乐,该软件支持多种音频播放软件,可在Mac上自动更改音乐~ 音频选择-与内…

javascript实现久久乘法口诀表、document、write、console、log

文章目录 正序乘法口诀表倒序乘法口诀表logconsoledocumentwrite 正序乘法口诀表 function multiplicationTable() {for (let i 1; i < 9; i) {let val ;for (let j 1; j < i; j) {document.write(j * i (i * j) &nbsp );val ${j}*${i}${i * j} ;}consol…

【Linux】进程间通信——管道/共享内存

文章目录 1. 进程间通信2. 管道匿名管道命名管道管道的特性管道的应用&#xff1a;简易的进程池 3. System V共享内存共享内存的概念共享内存的结构共享内存的使用代码实现 1. 进程间通信 进程间通信&#xff08;Inter-Process Communication&#xff0c;简称IPC&#xff09;是…

跨网络的通信过程、路由的作用以及默认网关

如下网络拓扑图&#xff0c;交换机0所在的网段为192.168.1.0/24&#xff0c;交换机1所在网段为192.168.2.0/24&#xff0c;且各自有2台主机&#xff1a; 假设PC0&#xff08;192.168.1.10/32&#xff09;要跟PC4&#xff08;192.168.2.11/32&#xff09;通信&#xff0c;如何实…

基于 chinese-roberta-wwm-ext 微调训练 6 分类情感分析模型

一、模型和数据集介绍 1.1 预训练模型 chinese-roberta-wwm-ext 是基于 RoBERTa 架构下开发&#xff0c;其中 wwm 代表 Whole Word Masking&#xff0c;即对整个词进行掩码处理&#xff0c;通过这种方式&#xff0c;模型能够更好地理解上下文和语义关联&#xff0c;提高中文文…

DuiLib中的list控件以及ListContainerElement控件

文章目录 前言1、创建list控件2、创建 ListContainerElement 元素&#xff0c;并添加到 List 控件中,这里的ListContainerElement用xml来表示3、在 ListContainerElement 元素中添加子控件 1、List控件2、ListContainerElement控件 前言 在 Duilib 中&#xff0c;List 控件用于…

Python 集合 add()函数使用详解,集合添加元素

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 add函数使用详解 1、元素的顺序2、可以添加的元素类型3、添加重复的元素4、一次只…

Python爬虫学习笔记:1688商品详情API 开发API接口文档

1688API接口是阿里巴巴集团推出的一种开放平台&#xff0c;提供了丰富的数据接口、转换工具以及开发资源&#xff0c;为开发者提供了通用的应用接口及大量数据资源&#xff0c;支持开发者在1688上进行商品搜索、订单管理、交易报表及物流等方面的操作。 1688API接口主要包含以…

Unity游戏源码分享-单车骑行游戏

Unity游戏源码分享-单车骑行游戏 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88057717

MySQL之DML和DDL

1、显示所有职工的基本信息&#xff1a; 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表。 …

react报错信息

报错信息 render函数里dom不能直接展示obj对象 取变量记得要有{} https://segmentfault.com/q/1010000009619339 这样在写的时候就已经执行方法了&#xff0c;所以此处用箭头函数&#xff08;&#xff09;》{}才会在点击时执行或者 遍历数据使用map来遍历&#xff0c;使用forea…