JVM学习记录(二)

本文详细介绍了Java字节码中的方法区域和操作数栈工作原理,通过示例代码演示了如何分析字节码指令执行过程,包括inti=0和i++的运算。作者鼓励读者指出可能的错误并关注后续内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法

字节码文件中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法Code属性中。

操作数栈

操作数栈是临时存放数据的地方。

分析字节码指令的执行

示例代码:

int i = 0;
int  j = i + 1;

该代码的字节码指令为

分析:

首先给操作数栈中赋0(iconst_0)

把数从栈中弹出,并赋值到i的位置(istore_1)

为什么i的位置是1,不是0?

因为在main方法中的String[] args占了0的位置了。

数的相加和比较需要在操作数栈中进行,所以执行到i+1时,系统需要取局部变量表的值和需要操作的值。

从i的位置取数据压栈(iload_1),和store不同的是,iload是赋值,不是剪切。

之后就是操作数栈压1,完成iadd操作,操作数栈此时为i+1=1。

最后执行istore_2把1给属性j的位置,完成所有操作后return。

经典面试题:

int i = 0;
i = i++;

i最后是多少?

首先我们看该程序的字节码指令

分析:

首先将0放到操作数栈中

把操作数栈中的值弹出到属性i的位置

因为i++是后执行的,需要先取到i的值

将本地变量表中指定的位置(x)增加(y)iinc 1 by 1

将操作数栈的值保存到局部变量表中

所以最后i是0

最后贴上++i的流程

本文基于作者自身的学习总结。如有错误,恳请指出。 如果对您有帮助的话,请给我点个赞吧。作者在后面也会分享文章,要是感兴趣也可以给我点个关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值