Java:内存分配,堆栈与堆

时间:2014-04-27 23:01:45

标签: java

当我们实例化下面的类时,请你给我存储在堆栈中的成员和存储在堆中的其他成员正确的划分:

class A{

    int x;
    static int y;

    void meth1(){
        //some code
    }

    static void meth2(){
        //some code
    }

}

1 个答案:

答案 0 :(得分:2)

对于Java pre-8:

  • static字段正在PermGen分配 - static int y到那里;
  • .class个对象正在PermGen分配 - class A去那里;
  • int或函数内声明的longdoublevoid等基元在堆栈中分配,而不是垃圾收集的主题 - 它们是'与返回地址和参数一起销毁;
  • 正在堆中分配其他本地和成员变量 - 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个对象。关于成员变量和堆栈,没有任何改变。