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

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

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

Что такое динамическая память?

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

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

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

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

  1. куча
  2. Стек
  3. Code
  4. статический

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

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

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

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

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

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

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

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

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

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

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

public void m1{
int x=20
}

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

Стек Java и куча

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

Стек Java и куча

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

Стек Java и куча

Стек Java и куча

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

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

Стек Java и куча

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

Стек Java и куча

Стек Java и куча

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

Account {
             Int p;
             Int q;
       }

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

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

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

Стек Java и куча

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

Стек Java и куча

Оператор присваивания «=» создаст ссылочную переменную, указывающую на объект в куче.

Стек Java и куча

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

Стек Java и куча

Стек метода m3 будет очищен.

Стек Java и куча

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

Стек Java и куча

Как только метод 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» будет создана в куче, которая, в свою очередь, будет указывать на свой объект, как показано на диаграмме ниже.

Стек Java и куча

Резюме:

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