Java堆和堆栈内存分配

Paw*_*wan 5 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");
          }
    }
Run Code Online (Sandbox Code Playgroud)

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

som*_*guy 28

对象始终存储在堆中.然而,参考per将被存储在在局部变量阵列,其被存储在所述用于创建main(String[]),它被保存在堆栈.

有关更多信息,请参阅:Java虚拟机的结构.

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

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


hig*_*ted 0

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