当我们实例化下面的类时,请你给我存储在堆栈中的成员和存储在堆中的其他成员正确的划分:
class A{
int x;
static int y;
void meth1(){
//some code
}
static void meth2(){
//some code
}
}
答案 0 :(得分:2)
对于Java pre-8:
static
字段正在PermGen
分配 - static int y
到那里; .class
个对象正在PermGen
分配 - class A
去那里; int
或函数内声明的long
,double
,void
等基元在堆栈中分配,而不是垃圾收集的主题 - 它们是'与返回地址和参数一起销毁; int x
去那里; 关于堆栈 - 它用于将指令指针值存储到命令调用子例程,并传递所有参数。我会写一个例子:
public void a(int x) {
}
public void b() {
this.a(5);
}
当调用this.a(5)
时,5
与调用this.a
的代码行(汇编代码,而不是Java)的地址一起堆叠。
在Java 8中,PermGen
已替换为metaspace
,因此现在存在static
个字段和.class
个对象。关于成员变量和堆栈,没有任何改变。