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
是一个局部变量,它将被存储在堆还是堆栈中?
答案 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
创建对象,就会在堆上分配它。