Стек и куча Java: Учебное пособие по распределению памяти Java

Содержание:

Anonim

Что такое стековая память?

Стек в java - это раздел памяти, который содержит методы, локальные переменные и ссылочные переменные. К памяти стека всегда обращаются в порядке «последним вошел - первым ушел». В стеке создаются локальные переменные.

Что такое кучная память?

Куча - это раздел памяти, который содержит объекты и может также содержать ссылочные переменные. Переменные экземпляра создаются в куче

Распределение памяти в Java

Выделение памяти в Java - это процесс, в котором разделы виртуальной памяти выделяются в программе для хранения переменных и экземпляров структур и классов. Однако память не выделяется объекту при объявлении, а создается только ссылка. Для выделения памяти объекта используется метод new (), поэтому объекту всегда выделяется память в куче.

Распределение памяти Java разделено на следующие разделы:

  1. Куча
  2. Куча
  3. Код
  4. Статический

Это разделение памяти необходимо для эффективного управления ею.

  • Раздел кода содержит ваш байт-код .
  • Стек часть памяти содержит методы, локальные переменные и опорные переменные.
  • Раздел кучи содержит объекты (также может содержать ссылочные переменные).
  • Статический раздел содержит статические данные / методу .

Разница между локальной переменной и переменной экземпляра

Переменная экземпляра объявляется внутри класса, но не внутри метода

class Student{int num; // num is instance variablepublic void showData{}

Локальная переменная объявляются в виде метода , включая метод аргументов .

public void sum(int a){int x = int a + 3;// a , x are local variables;}

Разница между стеком и кучей


Нажмите здесь, если видео недоступно

Давайте рассмотрим пример, чтобы лучше понять это.

Учтите, что ваш основной метод вызова метода m1

public void m1{int x=20}

В стеке java фрейм будет создан из метода m1.

Переменная X в m1 также будет создана в кадре для m1 в стеке. (См. Изображение ниже).

Метод m1 вызывает метод m2. В стеке java новый фрейм создается для m2 поверх фрейма m1.

Переменные b и c также будут созданы в кадре m2 в стеке.

public void m2(int b){boolean c;}

Тот же метод m2 вызывает метод m3. Снова в верхней части стека создается фрейм m3 (см. Изображение ниже).

Теперь предположим, что наш метод m3 создает объект для класса Account, который имеет два экземпляра переменной int p и int q.

Account {Int p;Int q;}

Вот код для метода m3

public void m3(){Account ref = new Account();// more code}

Выписка new Account () создаст объект account в куче.

Ссылочная переменная «ref» будет создана в стеке java.

Оператор присваивания заставит ссылочную переменную указывать на объект в куче.

Как только метод завершит свое выполнение. Поток управления вернется к вызывающему методу. В данном случае это метод m2.

Стек из метода m3 будет промыт.

Поскольку ссылочная переменная больше не будет указывать на объект в куче, она будет иметь право на сборку мусора.

Как только метод m2 завершит свое выполнение. Он будет извлечен из стека, и все его переменные будут сброшены и больше не будут доступны для использования.

Аналогично для метода m1.

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

Что, если Object имеет ссылку в качестве переменной экземпляра?

public static void main(String args[]) {A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }

В этом случае ссылочная переменная «child» будет создана в куче, которая, в свою очередь, будет указывать на свой объект, что-то вроде диаграммы, показанной ниже.

Резюме:

  • Когда вызывается метод, наверху стека создается фрейм.
  • Как только метод завершает выполнение, поток управления возвращается к вызывающему методу, и соответствующий ему стековый фрейм сбрасывается.
  • Локальные переменные создаются в стеке
  • Переменные экземпляра создаются в куче и являются частью объекта, которому они принадлежат.
  • Справочные переменные создаются в стеке.