浅谈虚拟机(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 在命令行反编译该代码,结果如下
从代码里面我们可以看到应该有三条操作,分别是对两个变量的赋值和一条i + j的操作。在此再对反编译的结果进行解读。以下为顺序解释
- 将int型常量1入栈到操作数栈。(普及一下,jvm的iconst指令用于将-1~5的int型常量入栈,其中-1用iconst_m1入栈)
- 将栈顶数据出栈到局部变量索引为1的内存单元(局部变量表索引从0开始)
- 将int型常量2入栈
- 出栈并存入局部变量索引为2的内存单元
- 将局部变量表第一个数据入栈
- 将局部变量表第二个数据入栈
- 将栈顶两个数据相加,并将结果压入栈顶
- 将相加返回的结果存入局部变量表第一个内存单元(变量i)
- 方法返回
下面看一下内存的演示图!
我们可以看到,反编译出来的内容入栈和出栈都是操作数栈。而局部变量表尽管在虚拟机栈中,却不是栈式存储,而是随机存取方式,根据索引进行存取。
回顾:操作数栈存储的是操作的信息,操作数和操作码。与局部变量表做一个对比,局部变量表中存放的是很单纯的局部变量,其数据操作需要与操作数栈进行交互,才能将其变为准备被操作的数据。
阅读全文
0 0
- 浅谈虚拟机(2.2)如何捅出了这一刀の操作数栈
- 串口出数了!
- 浅谈虚拟机(1)继承引发了一场血案の实例化中的继承
- iOS9的广告屏蔽功能在谷歌背后捅了致命一刀?
- 被 Google 捅了一刀之后,亚马逊是这样怼回去的
- 如何从虚拟机里面拷贝出文件
- 这代码哪里出了错误,要如何修改呢?
- 【java虚拟机】栈帧、局部变量表、操作数栈
- 【java虚拟机】栈帧、局部变量表、操作数栈
- 由年月日如何算出星期数
- 连续数打乱判断出少了哪些数?
- 【腾讯】连续数打乱判断出少了哪些数?
- 使用动态分配和指针操作求 9 个 double 数的乘积(编译通过了,但是运行时出错,谁能帮我看看出了什么问题啊)[em08]
- 顺序出栈操作
- catalan数 出栈序列
- 央企向“信息化人才瓶颈”开了第一刀
- 惨,阑尾发炎输液了,难道还得挨一刀?
- 买本子,给狠狠的宰了一刀
- Nginx 配置静态文件404问题
- 学习Linux命令(37)
- POJ 1269 Intersecting Lines(判断两条直线的位置关系)
- 36. OP-TEE中secure stroage的使用
- 51nod 1250 排列与交换
- 浅谈虚拟机(2.2)如何捅出了这一刀の操作数栈
- synchronized
- 目录菜单树的实现及查询
- leetcode--4. Median of Two Sorted Arrays
- xuptoj 1476快速幂(演示用):
- Win7下U盘安装Ubuntu16.04系统,并且配置登录校园网,亲测可行
- JavaScript模式之第2章总结
- think in java第八章多态 总结随笔
- dump stack(back trace)