2011-06-18 194 views
5
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是一個局部變量,它將被存儲在堆或堆棧上嗎?Java堆和堆棧內存分配

+2

你可能會考慮改變你對這個問題的接受答案。 – Gray

回答

0

在堆上。任何時候使用new來創建一個對象,它都會被分配到堆上。

28

對象始終存儲在。然而,參考per將被存儲在本地變量數組,其被存儲在幀main(String[])創建,它被保存在堆棧英寸

欲瞭解更多信息,請參閱:The Structure of the Java Virtual Machine

編輯:我已經學會了的JVM實際上能夠通過執行escape analysis堆棧上分配的對象。更好的是,可以應用名爲標量替換的技術,其中省略了對象分配,並將對象的字段視爲局部變量。可以在機器寄存器上分配變量。

堆棧分配逃逸分析自Java 6u14以來由HotSpot虛擬機實現。自從Java 6u23以來,它已被默認啓用。對於要在堆棧中分配的對象,它不得轉義正在執行的線程,方法體或作爲參數傳遞給另一個方法。