Подтвердить что ты не робот

Где JVM хранит примитивные переменные?

Где Java JVM хранит примитивные переменные и как память, используемая примитивами, освобождена после использования?

Я думаю, что это в стеке?

4b9b3361

Ответ 1

Упрощенный ответ: он зависит от того, где объявлена ​​переменная, а не от ее типа.

Локальные переменные хранятся в стеке. Экземпляры и статические переменные хранятся в куче.

Не забывайте, что для переменных ссылочного типа значение переменной является ссылкой, а не объектом. (Массивы также являются ссылочными типами - поэтому, если у вас есть int[], значения будут в куче.)

Теперь это потенциально слишком упрощенный ответ, поскольку интеллектуальная виртуальная машина может определить, относится ли конкретная ссылочная тип к объекту, который никогда не сможет "избежать" текущего метода. В этом случае он может потенциально включить весь объект в стек.

Но концептуально эта модель точна. Итак, переменная типа int, объявленная как переменная экземпляра, такая как:

class Foo
{
    private int value;
    ...
}

будет концептуально жить в куче, как часть данных любого экземпляра Foo. Он будет освобожден как часть освобождения экземпляра - всего 4 байта в блоке данных, представляющих экземпляр Foo; ему не требуется отдельное освобождение.

Ответ 2

Если переменная хранится, зависит от того, является ли переменная переменной локальной переменной или переменной экземпляра.

Локальные переменные хранятся в стеке . Экземпляр и статические хранятся в куче.

Позвольте мне объяснить это на примере. Допустим, у нас есть переменная-экземпляр экземпляра некоторого пользовательского класса 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().

Ответ 3

  • Объекты класса, включая код метода и статические поля: куча.
  • Объекты, включая поля экземпляра: куча.
  • Локальные переменные и вызовы методов: stack..