JVM——(24)字节码指令集与解析六(操作数栈管理指令)

本文深入解析JVM中操作数栈管理指令,包括dup、dup_x系列、pop和pop2指令的使用,以及它们在字节码执行过程中的作用。通过实例代码分析,展示这些指令如何影响栈帧的操作,帮助理解JVM执行机制。

往期文章

JVM——(1)为什么学习虚拟机
JVM——(2)聊聊JVM虚拟机
JVM——(3)类加载子系统
JVM——(4)运行时数据区的概述与程序计数器(PC寄存器)
JVM——(5)运行时数据区的虚拟机栈
JVM——(6)运行时数据区的本地方法栈
JVM——(7)运行时数据区的堆空间
JVM——(8)运行时数据区的方法区
JVM——(9)对象的实例化与访问定位
JVM——(10)执行引擎
JVM——(11)String Table(字符串常量池)
JVM——(12)垃圾回收概述
JVM——(13)垃圾回收相关算法
JVM——(14)垃圾回收相关概念的概述
JVM——(15)垃圾回收器详细篇
JVM——(16)Class文件结构一(描述介绍)
JVM——(17)Class文件结构二(解读字节码)
JVM——(18)Class文件结构三(JAVAP指令)
JVM——(19)字节码指令集与解析一(局部变量压栈、常量变量压栈、出栈局部变量表指令)
JVM——(20)字节码指令集与解析二(算数指令)
JVM——(21)字节码指令集与解析三(类型转换指令)
JVM——(22)字节码指令集与解析四(对象创建与访问指令)
JVM——(23)字节码指令集与解析五(方法调用指令与方法返回指令)
JVM——(24)字节码指令集与解析六(操作数栈管理指令)

一、操作数栈管理指令的概述


如同操作普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令可以直接用于操作操作数栈

常见指令包括如下内容:

将一个或两个元素从栈顶弹出,并且直接废弃,采用:pop、pop2指令

将复制栈顶的一个或两个数值,并将复制值或双份的复制值重新压入栈顶,采用dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2指令

将栈最顶端的两个Slot数值位置交换,采用:swap指令,Java虚拟机没有提供交换两个64位数据类型(long、 double)数值的指令

特殊指令:nop,它的字节码为ex00。和汇编语言中的nop一样,它表示什么都不做。这条指令一般可用于调试、占位等

这些指令属于通用型,对栈的压入或者弹出无需指明数据类型

不带_x 的dup指令说明

dup是复制栈顶数据并压入栈顶,一般包括两个指令:dup、dup2,系数代表要复制的slot个数

  • dup开头的指令用于复制1个Slot的数据。例:1个int 或者 1个reference
  • dup2开头的指令用于复制2个Slot的数据。例:1个long,或2个int,或1个int + 1个float
带_x 的dup指令说明

dup_x是复制栈顶数据并插入栈顶以下的某个位置,共有四个指令:dup_x1,dup2_x1,dup_x2,dup2_x2,只要将指令的dup和x的系数相加,结果即为需要插入的位置。

  • dup_x1插入位置:1+1=2,即栈顶2个Slot下面
  • dup_x2插入位置:1+2=3,即栈顶3个Slot下面
  • dup2_x1插入位置:2+1=3,即栈顶3个Slot下面
  • dup2_x2插入位置:2+2=4,即栈顶4个slot下面
pop指令与pop2指令说明
  • pop:将栈顶的1个s1ot数值出栈。例如1个short类型数值
  • pop2:将栈顶的2个Slot数值出栈。例如1个double类型数值,或者2个int类型数值

接下来我们针对于操作数栈指令的基本测试,请看以下示例代码

public class stackOperateTest {
    
    public void print( ){
        object obj = new object();
        string info = bj.toString();
    }
    
    //类似的
    public void foo(){
        bar();
    }
    
    public long bar(){
        return 0;
    }
    
    private long index = 0;
    
    public long nextIndex() {
        return index++;
    }
}

接下来我们编译该代码,看看print方法的字节码是什么情况?
在这里插入图片描述
接下来我们根据字节码指令进行图示解析分析,具体做了哪些操作?
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

若我们不需要采用info变量接收,直接调用obj.toString方法会是什么字节码呢?
在这里插入图片描述

接下来我们看看foo方法的字节码是什么情况?
在这里插入图片描述

接下来我们看看nextIndex方法的字节码是什么情况?
在这里插入图片描述

接下来我们根据字节码指令进行图示解析分析,具体做了哪些操作?
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

下面是本人的公众号:(有兴趣可以扫一下,文章会同步过去)
在这里插入图片描述

我是小白弟弟,一个在互联网行业的小白,立志成为一名架构师
https://blog.csdn.net/zhouhengzhe?t=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhz小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值