【jvm】虚拟机栈之操作数栈

目录

        • 一、说明
        • 二、图解
          • 2.1 代码示例
          • 2.2 javap操作
        • 三、图示
          • 3.1 bipush 15
          • 3.2 istore_1
          • 3.3 bipush 8
          • 3.4 istore_2
          • 3.5 iload_1
          • 3.6 iload_2
          • 3.7 iadd
          • 3.8 istore_3
          • 3.9 return结束
        • 四、附加

一、说明
  • 1.Operand Stack
  • 2.栈可以使用数组或链表来实现
  • 3.每一个独立的栈帧包含一个后进先出(Last-In-First-Out)的操作数栈
  • 4.也可称为表达式栈(expression stack)
  • 5.操作数栈在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)/出栈(pop)
  • 6.某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用它们后再把结果压入栈
  • 7.可以用来执行复制、交换、求和等操作
  • 8.操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间
  • 9.操作数栈是jvm执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的栈帧也会被创建出来,这个方法的操作数栈是空的
  • 10.每一个操作数栈都拥有一个明确的栈深度用于存储数值,所需的最大深度在编译器定义好了,保存在方法的code属性,为max_stack的值
  • 11.栈中的任何一个元素都是可以任意的java数据类型,32bit的类型占用一个栈单位深度,64bit的类型占用两个栈单位深度
  • 12.操作数栈并非采用访问索引的方式来进行数据访问,只能通过标准的入栈(push)和出栈(pop)操作来完成一次数据访问
  • 13.被调用的方法带有返回值,其返回值将会被压入当前栈帧的操作数栈中,并更新pc寄存器中下一条需要执行的字节码指令
  • 14.操作数栈中元素的数据类型必须与字节码指令的序列严格匹配,这由编译器在编译器期间进行验证,同时在类加载过程中的类检验阶段的数据流分析阶段要再次验证
  • 15.java虚拟机的解释引擎是基于栈的执行引擎,该栈指的就是操作数栈
二、图解
2.1 代码示例
package com.learning.stack.operand_stack;/*** @Author wangyouhui* @Description 操作数栈**/
public class OperandStackTest {public static void main(String[] args) {byte i = 15;int j = 8;int k = i + j;}
}
2.2 javap操作
javap -v OperandStackTest.class
Classfile /F:/jdk-learning/jvm/target/classes/com/learning/stack/operand_stack/OperandStackTest.classLast modified 2023-10-22; size 529 bytesMD5 checksum 82f8abcaba4fd78948113a564c4f83a1Compiled from "OperandStackTest.java"
public class com.learning.stack.operand_stack.OperandStackTestminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #3.#22         // java/lang/Object."<init>":()V#2 = Class              #23            // com/learning/stack/operand_stack/OperandStackTest#3 = Class              #24            // java/lang/Object#4 = Utf8               <init>#5 = Utf8               ()V#6 = Utf8               Code#7 = Utf8               LineNumberTable#8 = Utf8               LocalVariableTable#9 = Utf8               this#10 = Utf8               Lcom/learning/stack/operand_stack/OperandStackTest;#11 = Utf8               main#12 = Utf8               ([Ljava/lang/String;)V#13 = Utf8               args#14 = Utf8               [Ljava/lang/String;#15 = Utf8               i#16 = Utf8               B#17 = Utf8               j#18 = Utf8               I#19 = Utf8               k#20 = Utf8               SourceFile#21 = Utf8               OperandStackTest.java#22 = NameAndType        #4:#5          // "<init>":()V#23 = Utf8               com/learning/stack/operand_stack/OperandStackTest#24 = Utf8               java/lang/Object
{public com.learning.stack.operand_stack.OperandStackTest();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 7: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/learning/stack/operand_stack/OperandStackTest;public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=4, args_size=10: bipush        152: istore_13: bipush        85: istore_26: iload_17: iload_28: iadd9: istore_310: returnLineNumberTable:line 9: 0line 10: 3line 11: 6line 12: 10LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  args   [Ljava/lang/String;3       8     1     i   B6       5     2     j   I10       1     3     k   I
}
SourceFile: "OperandStackTest.java"
三、图示
3.1 bipush 15
  • 1.操作数栈和局部变量表一开始是空的
  • 2.pc寄存器记录要操作的指令地址是0
  • 3.byte i = 15;
  • 4.byte、short、char、boolean、int都以int型来保存,bipush中b表示byte,i表示int
  • 5.bipush 15是将15push到操作数栈当中
    在这里插入图片描述
3.2 istore_1
  • 1.pc寄存器记录要操作的指令地址2
  • 2.istore_1将栈顶的15存到局部变量表索引为1的位置
  • 3.已经转化为int类型了,所以用istore
  • 4.非静态方法,局部变量表索引为0的位置是this变量,因此istore存的是索引为1的位置
  • 5.操作数栈的栈顶出栈后变为空的
    在这里插入图片描述
3.3 bipush 8
  • 1.pc寄存器记录要操作的指令地址3
  • 2.把8压入操作数栈的栈顶
    在这里插入图片描述
3.4 istore_2
  • 1.pc寄存器记录要操作的指令地址5
  • 2.将操作数栈的栈顶数据出栈,保存到局部变量表索引为2的位置
  • 3.操作数栈的栈顶数据出栈后,变为空
    在这里插入图片描述
3.5 iload_1
  • 1.pc寄存器记录要操作的指令地址6
  • 2.iload_1将局部变量表中索引为1位置的数据取出压入操作数栈的栈顶
    在这里插入图片描述
3.6 iload_2
  • 1.pc寄存器记录要操作的指令地址7
  • 2.iload_2将局部变量表中索引为2位置的数据取出压入操作数栈的栈顶
    在这里插入图片描述
3.7 iadd
  • 1.pc寄存器记录要操作的指令地址8
  • 2.iadd会弹出操作数栈栈顶的数据,执行引擎将字节码指令翻译为机器指令,从而让cpu计算俩数据的和23
    在这里插入图片描述
  • 3.iadd将cpu计算的结果23压入操作数栈的栈顶
    在这里插入图片描述
3.8 istore_3
  • 1.pc寄存器记录要操作的指令地址9
  • 2.istore_3将操作数栈的栈顶数据出栈,保存到局部变量表索引为3的位置
  • 3.操作数栈的栈顶数据出栈后,变为空
    在这里插入图片描述
3.9 return结束
四、附加
  • 1.操作数栈从一开始到结束,只用到2个空间,即最大深度为2,即stack=2
  • 2.局部变量表最大索引位置为3,局部变量表最大长度为4,索引为0的位置是this变量,即locals=4
    在这里插入图片描述
  • 3.尽量会以最小的范围来匹配push,例如byte范围为-128到127,在这个范围内的数会用bipush压入操作数栈,short范围为-32768到32727,当一个整数超过了byte范围,但还在short范围内,会用sipush压入操作数栈,以此类推

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

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

相关文章

arcgis js api 4.x通过TileLayer类加载arcgis server10.2发布的切片服务跨域问题的解决办法

1.错误复现 2.解决办法 2.1去https://github.com/Esri/resource-proxy 网站下载代理配置文件&#xff0c;我下载的是最新的1.1.2版本&#xff0c;这里根据后台服务器配置情况不同有三种配置文件&#xff0c;此次我用到的是DotNet和Java. 2.2 DotNet配置 2.2.1 对proxy文件增加…

相交链表-力扣

一、题目描述 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、题解 注意题目所说的相交&#xff0c;相交节点不只是数值上的相等&#xff0c;而是相交以后两条链变成一条链。 解决改题目&#xff0c;我们可以&#xff1a;…

景联文科技提供4D-BEV标注工具:提升自动驾驶感知能力的精准数据支持

4D-BEV标注是一种用于自动驾驶领域的数据标注方法。在3D空间的基础上&#xff0c;加入了时间维度&#xff0c;形成了四个维度。这种方法通过精准地跟踪和记录动态对象&#xff08;如车辆、行人&#xff09;的运动轨迹、姿势变化以及速度等信息&#xff0c;全面理解和分析动态对…

Java中JVM、JRE和JDK三者有什么区别和联系?

任何语言或者软件的运行都需要环境。就像人要生活在空气中&#xff0c;鱼要活在水中&#xff0c;喜阴植物就不能放在阳光下暴晒一样&#xff0c;任何对象个体的存在都离不开其所需要的环境&#xff0c;编程语言亦是一样的。 java 语言的开发运行&#xff0c;也离不开 Java 语言…

crossover23.6闪亮登场发布啦,2023最新功能解析

CrossOver刚刚更新了23.6版本&#xff0c;新增了多款游戏的支持&#xff0c;快来看看你想玩的游戏在不在里面吧。点击这里立即下载最新版CrossOver。 软件介绍 CrossOver 23.6 让Mac可以运行Windows程序的工具 已通过小编安装运行测试 100%可以使用。 CrossOver for Mac 23.…

OKLink携手CertiK在港举办Web3生态安全主题论坛

2023年10月23日&#xff0c;OKLink与CertiK共同发起的Web3生态安全主题论坛在香港铜锣湾拉开帷幕。本次论坛由OKLink和CertiK主办&#xff0c;香港投资推广署独家支持&#xff0c;聚焦如何构建安全可靠的Web3生态系统议题&#xff0c;同时深入剖析这一进程中所面临的潜在挑战。…

企事业单位/公司电脑文件透明加密保护 | 防泄密软件\系统!

推荐——「天锐绿盾电脑文件防泄密系统」 一款全面的企业/公司数据透明加密防泄密系统&#xff0c;旨在从源头上保障数据的安全和使用安全。 PC访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 它具有以下特点&#xff1a…

第6周 .NET

好嘛&#xff01;本来以为上周SQL Server环境配置等已经够恶心了&#xff0c;没想到这周又得去搞所谓的Microsoft Visual Studio 2005了。 首先非常离谱的是&#xff0c;这个Microsoft Visual Studio 2005如果就是指Visual Studio 2005&#xff0c;那么已经是8年前的老的不行的…

TensorFlow图像多标签分类实例

接下来&#xff0c;我们将从零开始讲解一个基于TensorFlow的图像多标签分类实例&#xff0c;这里以图片验证码为例进行讲解。 在我们访问某个网站的时候&#xff0c;经常会遇到图片验证码。图片验证码的主要目的是区分爬虫程序和人类&#xff0c;并将爬虫程序阻挡在外。 下面…

Python超入门(6)__迅速上手操作掌握Python

# 26.函数和参数 # 注意&#xff1a;有参函数和无参函数的名字要不同 def user(): # 无参函数print("hello world!")def user1(my_id): # 有参函数print(my_id)def user2(first_name, last_name): # 有参函数print(fMy name is {first_name} {last_name})print(&…

【机器学习】迁移学习(Transfer)详解!

1. 什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法&#xff0c;就是把为任务 A 开发的模型作为初始点&#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务&#xff0c;虽然大多数机器学习算法都是…

微信小程序云开发笔记-初始化商城小程序

缘起&#xff1a;由于痴迷机器人&#xff0c;店都快倒闭了&#xff0c;没办法&#xff0c;拿出点精力搞一下店里的小程序&#xff0c;要多卖货才能活下来搞机器人&#xff0c;在此记录一下搞小程序的过程&#xff0c;要不然搞完又忘了。腾讯的云开发&#xff0c;前端和后端都有…

Linux阻塞IO(高级字符设备二)

阻塞IO属于同步 IO&#xff0c;阻塞IO在Linux内核中是非常常用的 IO 模型&#xff0c;所依赖的机制是等待队列。 一、等待队列介绍 在 Linux 驱动程序中&#xff0c;阻塞进程可以使用等待队列来实现。等待队列是内核实现阻塞和唤醒的内核机制&#xff0c;以双循环链表为基础结…

C笔记:引用调用,通过指针传递

代码 #include<stdio.h> int max1(int num1,int num2) {if(num1 < num2){num1 num2;}else{num2 num1;} } int max2(int *num1,int *num2) {if(num1 < num2){*num1 *num2; // 把 num2 赋值给 num1 }else{*num2 *num1;} } int main() {int num1 0,num2 -2;int…

SLAM从入门到精通(三边测量法详解)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 三边测量&#xff0c;或者说叫三角定位&#xff0c;是定位系统中很常见的一种测量方法。它最主要的原理就是依靠已有的三个特征坐标和半径&#xf…

Windows10系统安装telnet命令

简介 telnet命令可以测试目标服务器端口是否开通&#xff0c;使用命令 telnet ip地址 端口&#xff0c;输入命令后回车&#xff0c;如果进入输入状态&#xff0c;则表示目标服务器端口已开通&#xff0c;可以通过外网访问 Windows10系统安装步骤 1.打开控制面板 2.选择程序…

Hadoop3教程(三十一):(生产调优篇)异构存储

文章目录 &#xff08;157&#xff09;异构存储概述概述异构存储的shell操作 &#xff08;158&#xff09;异构存储案例实操参考文献 &#xff08;157&#xff09;异构存储概述 概述 异构存储&#xff0c;也叫做冷热数据分离。其中&#xff0c;经常使用的数据被叫做是热数据&…

Python Opencv实践 - 车辆统计(2)检测线绘制,车辆数量计数和显示

针对我所使用的视频&#xff0c;对上一节的代码进行了修改&#xff0c;增加了更多参数。 Python Opencv实践 - 车辆统计&#xff08;1&#xff09;读取视频&#xff0c;移除背景&#xff0c;做预处理_亦枫Leonlew的博客-CSDN博客示例中的图像的腐蚀、膨胀和闭运算等需要根据具…

操作系统-浅谈CPU与内存

目录 计算机的基本组成CPU内存虚拟内存内存分段内存分页 CPU与内存的交互过程高速缓存cache 所有图片均来自&#xff1a;小林coding 计算机的基本组成 计算机由软件和硬件组成 硬件由CPU(中央处理器&#xff09;存储器(内存外存&#xff09;外部设备组成。 软件由应用软件和系…

【算法】模拟退火算法(SAA,Simulated Annealing Algorithm)

模拟退火算法&#xff08;SAA&#xff09;简介 模拟退火算法&#xff08;SAA&#xff0c;Simulated Annealing Algorithm&#xff09;的灵感来源于工艺铸造流程中的退火处理&#xff0c;随着铸造温度升高&#xff0c;分子运动趋于无序&#xff0c;徐徐冷却后&#xff0c;分子运…