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。

这种结构,是不是很符号,我们函数调用的运行规则。

原文地址:https://www.cnblogs.com/zhouzhiyao/p/13188139.html