Java堆和栈内存分配

6
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是一个局部变量,它将被存储在堆栈上还是堆中?

per是一个局部变量,它将被存储在堆栈上。


2
你可能考虑将你接受的答案更改为这个问题的答案。 - Gray
2个回答

30

对象始终存储在堆中。但是,对于per的引用将存储在局部变量数组中,该数组存储在为main(String[])创建的帧中,该帧存储在栈中。

更多信息请参见: Java虚拟机结构

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

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


the reference to per” 是具有误导性的。per 是包含通过 new Person("Andy") 创建的对象引用的局部变量。局部变量的值将存储在堆栈帧中,这是对对象的引用。你也可以说,在堆栈帧中为局部变量 per 保留了内存。需要多少内存来引用一个对象就分配多少。但我认为,这才是你实际想要表达的内容... - Holger
@Holger:这就是我想说的,但我想可能没有表达清楚。感谢您的澄清。 - someguy

0

在堆上。任何时候使用new创建对象时,它都会分配在堆上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接