Що таке пам'ять стека?
Стек у 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. Знову на вершині стека створюється рамка м3 (див. Зображення нижче).
Тепер припустимо, наш метод m3 створює об'єкт для класу "Account", який має два екземпляри змінних int p і int q.
Account {Int p;Int q;}
Ось код для методу m3
public void m3(){Account ref = new Account();// more code}
Виписка new Account () створить об’єкт облікового запису в купі.
Посилальна змінна "ref" буде створена у стековому java.
Оператор присвоєння зробить посилальну змінну, щоб вказати на об'єкт у "Купі".
Як тільки метод завершить своє виконання. Потік управління повернеться до методу виклику. Що в даному випадку є методом m2.
Стек з методу m3 буде вимито.
Оскільки посилальна змінна більше не буде вказувати на об'єкт у купі, вона буде придатна для збору сміття.
Як тільки метод m2 завершить своє виконання. Він буде вискочений із стеку, і вся його змінна буде очищена і більше не буде доступною для використання.
Так само для методу m1.
Згодом потік управління повернеться до початкової точки програми. Що, як правило, є "основним" методом.
Що робити, якщо об’єкт має посилання як свою змінну екземпляра?
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 }
У цьому випадку в купі буде створена посилальна змінна "дочірня", яка в свою чергу буде вказувати на її об'єкт, щось на зразок схеми, показаної нижче.
Короткий зміст:
- Коли викликається метод, у верхній частині стека створюється кадр.
- Як тільки метод завершить виконання, потік керування повертається до виклику методу і відповідний фрейм стека змивається.
- Локальні змінні створюються в стеку
- Змінні екземпляра створюються в купі і є частиною об'єкта, якому вони належать.
- Посилальні змінні створюються в стеку.