Java静态与堆栈与线程

据我所知,所有的静态变量和静态方法将继续静态和所有的方法,在方法中声明的局部变量和引用变量将继续Stack,但是静态方法中的局部变量和引用变量呢? 我想他们会被分配到堆栈中,但我不确定它是如何工作的。

例如:

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

另外我想所有的线程共享静态以及他们共享堆,正确的?


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

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


我不认为有什么称为静态存储区。 如果它是原始类型变量,它将在堆栈中分配,如果它是引用类型,则对象本身在堆中分配,但引用到已放置对象的地址的变量将在堆栈中分配。 但是对于静态变量唯一不同的是它们将首先被初始化并且由JVM完成,所以它们将首先在Stack中分配,然后放在任何其他变量之前。

你可以在这里找到更多的信息:java中的静态分配 - 堆,堆栈和永久生成


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

这就是为什么这可以工作:

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.
    }
}
链接地址: http://www.djcxy.com/p/82865.html

上一篇: Java Static vs Stack with Thread

下一篇: Does a static variable go on the permanent gen space on the heap