2

JVM 中的每个线程都有自己的堆栈,它们是私有的。公共资源可以从堆中访问,所有线程都可以使用这些资源。让我们考虑以下代码:

public class Test {
   public static int getNum(num) {
      return num;
   }
   public static void main(String[ ] args) {
       int x = getNum(5);
       System.out.println(x);
   }
}

一旦Test类被加载,就会有一个线程main被执行。方法getNum存放在非堆内存的方法区,根据这篇文章 http://javapapers.com/core-java/java-jvm-memory-types/

为主线程分配了一个堆栈。现在我在这个线程中有两个方法调用。一个是getNum返回一个int,然后是System.out.printlnPrintstream类的静态方法)。

那么我是否可以在第一个方法调用被执行的地方创建一个新Stackmain stack,它返回到主线程以存储在变量x和一个新堆栈中,println其返回类型是void? 这个渐进式堆栈如何工作?还是我这里有什么问题...

4

1 回答 1

0

我认为您缺少stackstack frame之间的区别。

每个线程有一个堆栈。每个堆栈由帧组成。当main执行第一个方法调用时,一个新的堆栈帧被分配,然后getNum被调用,然后该帧被释放。现在轮到调用了println。同样,分配一个新的堆栈帧,执行调用,然后释放该帧。如果println自己进行一些方法调用,则新帧会在同一个堆栈上分配和释放,以适应调用顺序。堆栈帧以与其创建顺序相反的顺序被销毁(这就是为什么首先将此结构称为“堆栈”的原因)。

请注意,分配和取消分配堆栈帧非常有效,因为它通常是 CPU 硬件直接支持的操作。

于 2013-09-06T02:07:10.920 回答