Где Java JVM хранит примитивные переменные и как память, используемая примитивами, освобождена после использования?
Я думаю, что это в стеке?
Где Java JVM хранит примитивные переменные и как память, используемая примитивами, освобождена после использования?
Я думаю, что это в стеке?
Упрощенный ответ: он зависит от того, где объявлена переменная, а не от ее типа.
Локальные переменные хранятся в стеке. Экземпляры и статические переменные хранятся в куче.
Не забывайте, что для переменных ссылочного типа значение переменной является ссылкой, а не объектом. (Массивы также являются ссылочными типами - поэтому, если у вас есть int[]
, значения будут в куче.)
Теперь это потенциально слишком упрощенный ответ, поскольку интеллектуальная виртуальная машина может определить, относится ли конкретная ссылочная тип к объекту, который никогда не сможет "избежать" текущего метода. В этом случае он может потенциально включить весь объект в стек.
Но концептуально эта модель точна. Итак, переменная типа int
, объявленная как переменная экземпляра, такая как:
class Foo
{
private int value;
...
}
будет концептуально жить в куче, как часть данных любого экземпляра Foo
. Он будет освобожден как часть освобождения экземпляра - всего 4 байта в блоке данных, представляющих экземпляр Foo
; ему не требуется отдельное освобождение.
Если переменная хранится, зависит от того, является ли переменная переменной локальной переменной или переменной экземпляра.
Локальные переменные хранятся в стеке . Экземпляр и статические хранятся в куче.
Позвольте мне объяснить это на примере. Допустим, у нас есть переменная-экземпляр экземпляра некоторого пользовательского класса Animal. Животное животных = новая собака(); Здесь животное - это просто ссылка и находится в стек . Фактическому объекту выделяется память на куче. Это ссылочное животное укажет на эту память объекта, выделенную в куче. Поэтому, если у вас есть 3 ссылки, указывающие на один и тот же объект.
Animal animal1 = new Dog();
Animal animal2 = new Dog();
Animal animal3 = new Dog();
Все три ссылки будут в стеке. Когда я говорю ссылку, указывает указатель на объект в куче. В терминах памяти эта ссылка содержит адрес (на самом деле здесь немного больше абстракции) объекта в куче. Таким образом 4 байта на 32 бита и 8 байтов на 64 бита. Только когда все три ссылки разыменованы, т.е. Они больше не находятся в области видимости (или, скорее, больше не указывают на исходный объект), тогда только сборщик мусора может освобождать память, выделенную объекту в куче.
При хранении примитивных типов или строковых литералов существует небольшая вариация. Если вы явно не создаете свой объект с помощью оператора new(), они создаются и сохраняются в области permGen. Таким образом, обе ссылки firstString и secondString в
String firstString = "Stack";
String secondString = "Stack";
указывает на тот же объект в пуле строк. Он будет указывать на разные объекты, когда мы создадим их с помощью new().