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

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

java 操作 html java 操作数栈_操作数

Java虚拟机

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

java 操作 html java 操作数栈_java 栈 int_02

操作数栈

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

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

java 操作 html java 操作数栈_局部变量_03

代码

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

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

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

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