1.准备代码

public int calc() {
  int a = 100;
  int b = 200;
  int c = 300;
  return (a + b) * c;
}

2.使用javap -verbose查看class文件

  该方法主要的指令内容如下

public int calc();
Code:
Stack=2, Locals=4, Args_size=1
0: bipush 100
2: istore_1
3: sipush 200
6: istore_2
7: sipush 300
10: istore_3
11: iload_1
12: iload_2
13: iadd
14: iload_3
15: imul
16: ireturn
}
  javap提示这段代码需要深度为2的操作数栈和4个变量槽的局部变量空间
 
3.执行过程
3.1偏移量为0的指令
  首先,执行偏移地址为0的指令,Bipush指令的作用是将单字节的整型常量值(-128~127)推入操作数栈顶,跟随有一个参数,指明推送的常量值,这里是100。
 
3.2偏移量为2的指令
  istore_1指令的作用是将操作数栈顶的整型值出栈并存放到第1个局部变量槽中。
  后续几条条指令(直到偏移为11的指令为止)都是做一样的事情,也就是在对应代码中把变量a、b、c赋值为100、200、300。
 
3.3偏移量11的指令

  iload_1指令的作用是将局部变量表第1个变量槽中的整型值复制到操作数栈顶。

 
3.4偏移量为12
  iload_2指令的执行过程与iload_1类似,把第2个变量槽的整型值入栈。
 
3.5偏移量为13

  iadd指令的作用是将操作数栈中头两个栈顶元素出栈,做整型加法,然后把结果重新入栈。在iadd指令执行完毕后,栈中原有的100和200被出栈,它们的和300被重新入栈。

3.6偏移量为14的指令

  iload_3指令把存放在第3个局部变量槽中的300入栈到操作数栈中。这时操作数栈为两个整数300。

3.8偏移量15的指令

  imul是将操作数栈中头两个栈顶元素出栈,做整型乘法,然后把结果重新入栈,与iadd完全类似。

3.7偏移量16的指令

  ireturn指令是方法返回指令之一,它将结束方法执行并将操作数栈顶的整型值返回给该方法的调用者。
  到此为止,这段方法执行结束。

参考<<深入理解java虚拟机3>>

最新文章

  1. 分享一个php的启动关闭脚本(原)
  2. mysql 常用查询
  3. VIM的强大功能
  4. [麦先生]Laravel SQL语句记录方式
  5. sqlmap我常用到的几个参数
  6. 实验二Step1-有序顺序表
  7. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】08-基本运算
  8. 部署MongoDB扩展并测试使用php简单连接操作之
  9. MD中bitmap源代码分析--数据结构
  10. linux 安装gcc和g++
  11. Apriori关联分析算法概述
  12. [51nod1410]回文调整
  13. JAVA开发中遇到的异常总结
  14. 洛谷 P1053 音乐会的等待 解题报告
  15. jQuery的$.getScript方法去加载javaScript文档解析
  16. 黑客编程教程(六)Windows的关机和重起
  17. 跟我学算法-tensorflow 实现卷积神经网络附带保存和读取
  18. Golang开发环境搭建-Vim篇
  19. 标准C++ I/O库 迭代器让数据自由流动 V8
  20. SecureCRT中 secureCRT使用VIM时对语法高亮

热门文章

  1. 二叉树总结——BiTree
  2. 【云原生 · Kubernetes】部署高可用 kube-controller-manager 集群
  3. 安装kali linux(干货)
  4. 基于python的数学建模---pulp库
  5. C++ using 编译指令与名称冲突
  6. 干电池升压5V,功耗比较低
  7. swiper3踩坑
  8. 布尔值、元组、集合、input、格式化输出、赋值、运算符
  9. 组策略编辑器(gpedit.msc)找不到文件解决方法
  10. elementui中 table表格 合并表头