Java (Stack & Heap) - что происходит с памятью в этом простом примере - PullRequest
0 голосов
/ 08 декабря 2011

Кто-нибудь может объяснить, что происходит с памятью (Stack & Heap) в этом примере? Если я правильно понимаю, java хранит объекты в куче, поэтому i1 будет в куче ... то же самое со строкой? Но как насчет i2, учитывая, что это объявление поля класса.

public ExampleClass {
   Integer i1=new Integer(1);
   int i2 = 2;
   String str = "abc";
}

Ответы [ 5 ]

1 голос
/ 08 декабря 2011

Все они хранятся в куче.

Как говорит тег SO:

Куча - это память процесса, выделенная для динамического выделения.

Таким образом, любая переменная будет помещена в кучу.

Однако все примитивные типы (int, float и т. Д.) Будут храниться в стеке ** только в том случае, если они размещены локально внутри метода).

Смотрите здесь для получения дополнительной информации.

0 голосов
/ 08 декабря 2011

Все инициализированные значения устанавливаются в конструкторе. Находясь в конструкторе, ссылки помещаются в стек, а затем поля в куче. Как только конструктор возвращается, ссылка на сам объект остается в стеке, но все поля находятся только в куче.

0 голосов
/ 08 декабря 2011
public ExampleClass {
   Integer i1=new Integer(1); //heap
   int i2 = 2; //heap
   String str = "abc"; //permGen
}

В стековых хранилищах только локальные экземпляры / примитивы, доступные только одному потоку, куча - это общее место (доступно любому количеству потоков), permGen - это еще одна часть памяти Java, используемая для хранения интернированных строк и загруженных классов.

0 голосов
/ 08 декабря 2011

Ничего не произойдет, пока у вас не появится код типа new ExampleClass(). Как только вы это сделаете, новый объект будет размещен в куче. В него будут включены ссылки на i1, i2 и str. Я предполагаю, что, поскольку у вас нет метода, то i2 будет автоматически конвертировано за сцену в эквивалент Integer i2 = new Integer(0). Все 3 из этих ссылок будут указывать на объекты, также расположенные в куче. Обратите внимание, что строки являются неизменяемыми, поэтому, если уже есть String со значением "abc", то ссылка может указывать на это.

0 голосов
/ 08 декабря 2011

Очень лаконично: Stack: [i1-addr, 2, str-addr] Heap : [i1-addr : 1, str-addr : 'a','b','c']. Для кучи я использую обозначение [addres: value]. Конечно, куча кроме значения куча также содержит некоторую информацию об объекте (например, ссылку на объект .class).

...