Java Stack and Heap: учебное пособие по распределению памяти Java

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

Стек в java – это раздел памяти, который содержит методы, локальные переменные и ссылочные переменные. Память стека всегда ссылается в порядке “Last-In-First-Out”. Локальные переменные создаются в стеке.

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

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

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

JVM разделил память на следующие разделы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оператор new Account () создаст объект счета в куче.

Контрольная переменная “ref” будет создана в стек java.

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

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

Стек из метода m3 будет выгружен.

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

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

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

В конце концов, поток управления вернется к начальной точке программы. Обычно это “основной” метод.

Что, если объект имеет ссылку как свою переменную экземпляра?

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

Резюме:

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

Ответить

Хотите присоединиться к обсуждению?
Не стесняйтесь вносить свой вклад!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *