据我所知,所有静态变量和静态方法都将继续静态和所有方法,方法中声明的局部变量和引用变量将继续使用Stack,但静态中的局部变量和引用变量如何方法 ?我猜他们将被分配到堆栈,但我不确定它是如何工作的。
例如:
public static void A(){
int x = 3;
Point p = new Point();
}
另外我猜所有线程共享静态以及它们共享Heap,对吗?
答案 0 :(得分:2)
您可以将局部变量视为始终在执行线程的堆栈上分配。我猜JIT编译器可以将它们优化为寄存器,但从语义上讲它们与堆栈分配的变量无法区分。它们的范围和生命周期对于函数的每次调用都是私有的。
您还会询问静态变量(类变量)和堆。类变量在线程之间共享,在某种意义上,无论哪个线程正在执行,对类变量的引用都引用相同的变量。对于驻留在堆上的对象也是如此。
答案 1 :(得分:1)
我认为没有一种称为静态存储区的东西。如果它是原始类型变量,它将在Stack中分配,如果它是引用类型,则对象本身在Heap中分配,但引用对象的地址的变量将在Stack中分配。但静态变量唯一不同的是它们将首先被初始化并由JVM完成,因此它们将首先在Stack中分配,然后再在任何其他变量之前分配。
您可以在此处找到更多信息: static allocation in java - heap, stack and permanent generation
答案 2 :(得分: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.
}
}