2011-06-18 19 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 jest zmienną lokalną, gdzie będzie przechowywany, na stercie lub stosie?Przydział pamięci stosu i stosu sterty

+2

Możesz rozważyć zmianę zaakceptowanej odpowiedzi na to pytanie. – Gray

Odpowiedz

0

Na stercie. Za każdym razem, gdy używasz new do utworzenia obiektu, zostaje on przydzielony do sterty.

28

Obiekty są zawsze przechowywane w sterty . Jednakże odniesienie do per zostaną zapisane w zmiennej lokalnej tablicy, który jest przechowywany w ramy utworzonej na main(String[]), który jest przechowywany w stosu. Aby uzyskać więcej informacji, zobacz: The Structure of the Java Virtual Machine.

Edit: Nauczyłem się, że JVM faktycznie są w stanie przeznaczyć przedmiotów na stosie wykonując escape analysis. Co więcej, można zastosować technikę o nazwie , zastępując skalarną, w której pominięto przydział obiektu, a pola obiektu są traktowane jako zmienne lokalne. Możliwe jest przydzielanie zmiennych do rejestrów maszynowych.

Analiza ucieczki przez alokację stosów została zaimplementowana przez maszyny wirtualne HotSpot od wersji Java 6u14. Jest on domyślnie włączony od czasu Java 6u23. Aby obiekt został przydzielony na stosie, nie może wyminąć wątku wykonawczego, treści metody ani zostać przekazany jako argument do innej metody.