关于jvm:我所知道JVM虚拟机之字节码指令集与解析六操作数栈管理指令

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


如同操作一般数据结构中的堆栈那样,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办法的字节码是什么状况?

接下来咱们依据字节码指令进行图示解析剖析,具体做了哪些操作?





评论

发表回复

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

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理