Что такое стековая память?
Стек в java - это раздел памяти, который содержит методы, локальные переменные и ссылочные переменные. К памяти стека всегда обращаются в порядке «последним вошел - первым ушел». В стеке создаются локальные переменные.
Что такое кучная память?
Куча - это раздел памяти, который содержит объекты и может также содержать ссылочные переменные. Переменные экземпляра создаются в куче
Распределение памяти в Java
Выделение памяти в Java - это процесс, в котором разделы виртуальной памяти выделяются в программе для хранения переменных и экземпляров структур и классов. Однако память не выделяется объекту при объявлении, а создается только ссылка. Для выделения памяти объекта используется метод new (), поэтому объекту всегда выделяется память в куче.
Распределение памяти Java разделено на следующие разделы:
- Куча
- Куча
- Код
- Статический
Это разделение памяти необходимо для эффективного управления ею.
- Раздел кода содержит ваш байт-код .
- Стек часть памяти содержит методы, локальные переменные и опорные переменные.
- Раздел кучи содержит объекты (также может содержать ссылочные переменные).
- Статический раздел содержит статические данные / методу .
Разница между локальной переменной и переменной экземпляра
Переменная экземпляра объявляется внутри класса, но не внутри метода
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» будет создана в куче, которая, в свою очередь, будет указывать на свой объект, что-то вроде диаграммы, показанной ниже.
Резюме:
- Когда вызывается метод, наверху стека создается фрейм.
- Как только метод завершает выполнение, поток управления возвращается к вызывающему методу, и соответствующий ему стековый фрейм сбрасывается.
- Локальные переменные создаются в стеке
- Переменные экземпляра создаются в куче и являются частью объекта, которому они принадлежат.
- Справочные переменные создаются в стеке.