Java 虚拟机栈
栈结构
栈,这种数据结构,太重要了。如果学习过算法,就可以了解它的强大了。
栈,就像我们叠起来的盘子,只能对最上面的部分进行操作。对于栈,只有两种操作:
- 入栈,在上面再加一个盘子
- 出栈,拿掉最上面的盘子
别小看这两种操作,他可以完成很多复杂的事情,这就是数据结构和算法的魅力。
JVM 的运行是基于栈的指令集,也就是说,JVM 对于数据的操作,都是基于栈这种数据结构的。
栈指令集
我们写一段代码:
package runningDate;
public class JavaStackTest {
public static void main(String[] args) {
int a = 5;
int b = 2;
int c = a + b;
int d = a * b;
}
}
我们获得编译后的 .class 文件的表示
0 iconst_5
1 istore_1
2 iconst_2
3 istore_2
4 iload_1
5 iload_2
6 iadd
7 istore_3
8 iload_1
9 iload_2
10 imul
11 istore 4
13 return
我们来看其中的 iadd 介绍
可以看到,其中说到,每个值是从栈中出栈得到的。
栈、栈帧、方法
在程序中,方法的调用是非常常见的。
而方法的调用和栈这个结构来说,是非常的匹配。
我们看到上图,我们以每一个方法作为一个栈帧。当我们调用方法1的时候,方法1的相关内容就作为栈帧1 压入栈中。如果方法1 中调用了 方法2,方法2 也压栈,以此类推。
最后,我们看到,方法4 对应的 栈帧4 在最顶端。栈帧4 作为当前栈帧,线程也只能执行当前栈帧,也就是执行方法4。当方法4结束的时候,当前栈帧就变成了栈帧3。
这种结构,是不是很符号,我们函数调用的运行规则。