浅谈虚拟机(2.2)如何捅出了这一刀の操作数栈

来源:互联网 发布:美妙天堂知里绘画图片 编辑:程序博客网 时间:2024/05/16 18:28

操作数栈

重点知识:

  • 操作数:待操作的数据
  • 操作码:操作指令本身
  • PC(程序计数器):一个寄存器,存放操作的首地址
  • 操作:由多条指令形成一个操作

操作数栈也是存放在栈帧中的一块内存区域,仅存放两种数据:操作数、操作码。在JVM中,用到的寄存器只有PC(程序计数器)寄存器,因此指令的存放需要一块内存区域,这个区域就是操作数栈了。
我们通过一段很简单的代码来看,操作数栈是怎样工作的。

public class Main{    public static void main(String[] args){        int i = 1;        int j = 2;              i = i + j;        return;    }}

用javap -verbose 在命令行反编译该代码,结果如下
操作数栈反编译1
从代码里面我们可以看到应该有三条操作,分别是对两个变量的赋值和一条i + j的操作。在此再对反编译的结果进行解读。以下为顺序解释

  1. 将int型常量1入栈到操作数栈。(普及一下,jvm的iconst指令用于将-1~5的int型常量入栈,其中-1用iconst_m1入栈)
  2. 将栈顶数据出栈到局部变量索引为1的内存单元(局部变量表索引从0开始)
  3. 将int型常量2入栈
  4. 出栈并存入局部变量索引为2的内存单元
  5. 将局部变量表第一个数据入栈
  6. 将局部变量表第二个数据入栈
  7. 将栈顶两个数据相加,并将结果压入栈顶
  8. 将相加返回的结果存入局部变量表第一个内存单元(变量i)
  9. 方法返回

下面看一下内存的演示图!这里写图片描述

我们可以看到,反编译出来的内容入栈和出栈都是操作数栈。而局部变量表尽管在虚拟机栈中,却不是栈式存储,而是随机存取方式,根据索引进行存取。

回顾:操作数栈存储的是操作的信息,操作数和操作码。与局部变量表做一个对比,局部变量表中存放的是很单纯的局部变量,其数据操作需要与操作数栈进行交互,才能将其变为准备被操作的数据。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 6个月婴儿高烧怎么办 7个月婴儿高烧怎么办 11个月婴儿高烧怎么办 4个月婴儿高烧怎么办 新生宝宝混合喂养消化不良怎么办 四个月的宝宝不追听不追视怎么办 宝宝母乳换奶粉拉肚子怎么办 奶牛产奶脂肪低怎么办 新生儿混合喂养不喝水怎么办 小孩子咳嗽怎么办有什么偏方 混合喂养宝宝不喝奶粉怎么办 混合喂养宝宝不吃奶粉怎么办 混合喂养宝宝不吃奶瓶怎么办 混合喂养的宝宝不吃奶粉怎么办 三个月的宝宝突然不吃奶粉怎么办 四个月宝宝拉绿屎推拿怎么办 三个月大的宝宝消化不良怎么办 婴儿大便常规正常的腹泻怎么办 宝宝十个月母乳不够吃怎么办 吃药上吐腹泻在3怎么办 房子买了新生儿户口怎么办 吃海鲜拉稀拉水怎么办 吃海鲜腹泻拉水怎么办 两个月宝宝不爱睡觉怎么办 2个月宝宝干呕怎么办 9个月宝宝拉稀的怎么办 宝宝拉肚子快一个月了怎么办 满月宝宝发烧38度怎么办 大人腹泻10天了怎么办 十个月宝贝拉水怎么办 十个月宝宝脱水哭闹怎么办 宝宝肠胃不好老是拉肚子怎么办 七个月的宝宝老是拉肚子怎么办 6个月宝宝拉肚子怎么办 没满月宝宝吐奶怎么办 八个月宝宝有点拉肚子怎么办 4个月宝宝拉水怎么办 2岁宝宝消化不好拉肚子怎么办 两岁宝宝老拉肚子怎么办 2岁宝宝拉肚子老不好怎么办 2岁宝宝一直拉肚子不好怎么办