Java堆和堆栈内存分配

时间:2011-06-18 13:44:02

标签: java memory memory-management

class Person{
          private String name;
          public Person(){
          }

          public Person(String name){
              this.name=name;
          }

          public static void main(String[] arg)
          {
                Person per= new Person("Andy");
          }
    }

per是一个局部变量,它将被存储在堆还是堆栈中?

2 个答案:

答案 0 :(得分:28)

对象始终存储在中。但是,{em>引用到per将存储在局部变量数组中,该数组存储在为{{创建的 frame 中。 1}},存储在堆栈

有关详细信息,请参阅:The Structure of the Java Virtual Machine

编辑我了解到,JVM实际上可以通过执行escape analysis堆栈上分配对象。更好的是,可以应用一种称为标量替换的技术,其中省略了对象分配,并且将对象的字段视为局部变量。变量可以在机器寄存器上分配。

自Java 6u14以来,HotSpot VM已经实现了堆栈分配的逃逸分析。它自Java 6u23起默认启用。对于要在堆栈上分配的对象,它不能转义正在执行的线程,方法体或作为参数传递给另一个方法。

答案 1 :(得分:0)

在堆上。只要您使用new创建对象,就会在堆上分配它。