2

据我所知,所有静态变量和静态方法都将继续进行静态,并且在方法中声明的所有方法、局部变量和引用变量都将继续进行堆栈,但是静态方法中的局部变量和引用变量呢?我猜它们将被分配到堆栈上,但我不确定它是如何工作的。

例如:

 public static void A(){
      int x = 3;
      Point p = new Point();
 } 

另外我猜所有线程共享静态以及共享堆,对吗?

4

3 回答 3

2

您可以将局部变量视为始终分配在执行线程的堆栈上。我猜 JIT 编译器可以将它们优化为寄存器,但在语义上它们与堆栈分配的变量没有区别。它们的范围和生命周期对于函数的每次调用都是私有的。

您还询问静态变量(类变量)和堆。类变量在线程之间共享,因为无论哪个线程正在执行,对类变量的引用都引用同一个变量。对于驻留在堆上的对象也是如此。

于 2012-05-21T19:20:12.307 回答
1

我认为没有所谓的静态内存区。如果它是原始类型变量,它将在 Stack 中分配,如果它是引用类型,则对象本身将在 Heap 中分配,但引用对象所在地址的变量将在 Stack 中分配。但是静态变量唯一不同的是它们将首先被初始化并且由JVM完成,因此它们将首先在堆栈中分配,然后再分配任何其他变量。

您可以在此处找到更多信息: java 中的静态分配 - 堆、堆栈和永久代

于 2012-05-21T19:54:14.283 回答
0

每个定义都放在当前上下文的堆栈中。本质上,每次你拥有一个新的上下文都会被压入{堆栈,当你拥有}. 然后在给定上下文中声明的所有变量都被添加到堆栈顶部的当前上下文中。弹出上下文时,包含的所有定义都将被遗忘。

这就是为什么它有效:

public void method() {
    {
        int x = 0;
    }

    // x isn't defined here

    {
        int x = 0;  // This doesn't conflict with the previous declaration of x because we just created a new context and the other one was popped before.
    }
}
于 2012-05-21T19:24:35.040 回答