Какво е паметта на стека?
Стекът в Java е част от паметта, която съдържа методи, локални променливи и референтни променливи. Паметта на стека винаги се препраща в подредбата Last-In-First-Out. Локалните променливи се създават в стека.
Какво е Heap Memory?
Heap е част от паметта, която съдържа обекти и може да съдържа референтни променливи. Променливите на инстанцията се създават в купчината
Разпределение на паметта в Java
Разпределението на паметта в Java е процесът, при който разделите на виртуалната памет се заделят в програма за съхранение на променливите и екземплярите на структури и класове. Обаче паметта не се разпределя към обект при декларация, а се създава само препратка. За разпределението на паметта на обекта се използва метод new (), така че обектът винаги има разпределена памет в купчината.
Разпределението на паметта на Java е разделено на следните раздели:
- Куп
- Стек
- Код
- Статично
Това разделяне на паметта е необходимо за нейното ефективно управление.
- Разделът с кода съдържа вашия байт код .
- Разделът 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 }
В този случай референтната променлива "дете" ще бъде създадена в купчина, която от своя страна ще сочи към своя обект, нещо като диаграмата, показана по-долу.
Резюме:
- Когато се извика метод, в горната част на стека се създава рамка.
- След като методът завърши изпълнението, потокът от контрол се връща към извикващия метод и съответният фрейм на стека се изтрива.
- Локалните променливи се създават в стека
- Променливите на инстанцията се създават в купчината и са част от обекта, към който принадлежат.
- Референтните променливи се създават в стека.