干货分享丨Java进阶JVM系列课之操作数栈

144 篇文章 0 订阅
107 篇文章 2 订阅

对于学习Java的伙伴们来说,JVM的操作数栈是个非常关键的知识点,今天来分享一下关于操作数栈。当然还有一些东西要去讲:比如说程序计数器、本地方法栈、堆Heap 分代模型等。没关系,咱们先从最重要的操作数栈讲起。

我们先用一张图直观来了解一下JVM运行时的数据区。

Java虚拟机

实际上,操作数栈并不是采用访问索引的方式而是入栈+出栈的一波操作完成数据访问,所以与局部变量表有很大不同。另外每一个操作数栈在关于存储数值以及容量有一定的特征。

操作数栈

当一个方法被调用的时候,操作数栈作为JVM执行引擎的一个工作区,一个新的栈帧被创建,但这时栈帧中的操作数栈却是空的。只有方法在执行的过程中,才会有字节码指令往操作数栈中执行入栈和出栈操作。比如一个简单的加法运算,需要先从操作数栈中将需要执行运算的两个数值出栈,待运算执行完成后,再将运算结果入栈。

在讲操作数栈的时候我们需要对字节码文件进行反编译,下面反编译一下文件,字节码生成指令命令。

代码

int j = 0 --> 是不是对应这一句话? 你得想局部变量存哪里?没错,存局部变量表里面的。很明显int j = 0 应该不是只有一步,再来看第二步。

istore_2 将栈顶int型数值存入局部变量表第三个本地变量。两条指令完成这一部分操作,为什么我们说 i++会有线程安全的问题?

要调用这个方法肯定先加载 int i ; 那么至少第二个位置是 i呢? 当然这个我们是假设,接下来我们验证一下。看第二行代码:iload_1。将第二个int型本地变量(i)推送至栈顶,很明显第二个位置就是i。

操作数栈是栈帧四个区域之一,它明确了程序代码其实就是在JVM中各种指令的集合,让我们更加清楚了解到了代码运行的原理,深入JVM底层探究,开阔你的知识面,加油吧骚年!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值