jvm | 基于栈的解释器执行过程
2024-08-30 07:37:09
一段简单的算术代码:
public class Demo {
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = (a + b) * 5;
}
}
通过javac编译,得到Demo.class。通过javap可以看到main()方法的字节码是:
Code:
stack=2, locals=4, args_size=1
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: iconst_5
8: imul
9: istore_3
10: return
javap提示这段代码需要深度为2的操作数栈和4个Slot(下图有误,下标为0的应该是this)的局部变量空间
下面是解释器的执行过程:
首先执行偏移地址为0的指令,iconst_1指令的作用是将int型1推送至操作数栈顶,
然后执行偏移地址为1的指令,istore_1指令的作用是将栈顶int型数值存入第二个本地(局部)变量(上图有误,第一个本地变量应是this)
。。。
然后执行偏移地址为4的指令,iload_1的作用是将第二个int型本地变量推送至栈顶
。。。
然后执行偏移量为6的指令,iadd的作用是将栈顶两int型数值相加并将结果压入栈顶
。。。
然后imul指令同理
然后return,程序结束。。。
然而jvm实际的运作过程真是这样吗?答案是并不是这样,因为上面的执行过程仅仅是一种概念模型,
实际情况会和上面描述的概念模型差距非常大,这种差距产生的原因是虚拟机中解析器和即时编译器都会对字节码进行优化
当然优化的手段是花样繁多的。。。
不过,我们能通过上面的运行过程看出栈结构指令集的一般运行过程,这就够了。。。
详情请看:java虚拟机字节码指令表
最新文章
- 使用Redis的INCR、Hsetnx、Hincrby的命令生成序列号
- ExtJs 实现表单联动
- c语言中三个点的解释 : variadic
- java安装教程
- HB制作的app版本更新
- Jquery dialog属性
- 【php】assert函数的用法
- Asp.Net的两种开发方式
- API判断网站IP地址,国家区域
- php 中cookie和session的用法比较
- HTML5学习(六)---------SVG 与Canvas
- HDU_2016——数据的交换输出
- 滴滴专车司机苹果手机ios客户端可以下载了
- SQL Server2008数据库中删除用户,提示数据库主体在该数据库中拥有 架构,无法删除
- 微信小程序开发之picker
- BZOJ_1717_[Usaco2006 Dec]Milk Patterns 产奶的模式_后缀数组
- Unity GC 优化要点
- spring(spring mvc)整合WebSocket案例(获取请求参数)
- MySQL5.7.32 通用版本安装
- 非常完善的Log4net详细说明(转)