Java стек и купчина: Урок за разпределение на паметта в Java

Съдържание:

Anonim

Какво е паметта на стека?

Стекът в Java е част от паметта, която съдържа методи, локални променливи и референтни променливи. Паметта на стека винаги се препраща в подредбата Last-In-First-Out. Локалните променливи се създават в стека.

Какво е Heap Memory?

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

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

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

Разпределението на паметта на Java е разделено на следните раздели:

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

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

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

Разлика между локална и инстанционна променлива

Променливата на инстанцията се декларира вътре в клас, но не и вътре в метод

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 създава обект за клас "Акаунт", който има два екземпляра променлива int p и int q.

Account {Int p;Int q;}

Ето кода за метод m3

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

Извлечението new Account () ще създаде обект на акаунт в купчина.

Референтната променлива "ref" ще бъде създадена в стека Java.

Операторът за присвояване ще направи референтна променлива, която да сочи към обекта в Heap.

След като методът завърши изпълнението си. Потокът от контрол ще се върне към метода на извикване. Което в този случай е метод 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 }

В този случай референтната променлива "дете" ще бъде създадена в купчина, която от своя страна ще сочи към своя обект, нещо като диаграмата, показана по-долу.

Резюме:

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