logo

Стек проти купи Java

У Java, управління пам'яттю це життєво важливий процес. Він автоматично керується Java. JVM ділить пам'ять на дві частини: стек пам'ять і пам'ять купи. З точки зору Java, обидві є важливими областями пам’яті, але обидві використовуються для різних цілей. The основна різниця між пам'яттю стека та пам'яттю купи полягає в тому, що стек використовується для зберігання порядку виконання методу та локальних змінних, тоді як пам’ять купи зберігає об’єкти та використовує динамічний розподіл пам’яті та звільнення. У цьому розділі ми детально обговоримо відмінності між стеком і купою.

Стек проти купи Java

Стекова пам'ять

Стекова пам'ять - це фізичний простір (в оперативній пам'яті), виділений кожному потоку під час виконання. Він створюється, коли створюється потік. Керування пам’яттю в стеку відбувається за порядком LIFO (останній прийшов – першим вийшов), оскільки доступ до нього доступний глобально. Він зберігає змінні, посилання на об’єкти та часткові результати. Пам'ять, виділена для стека життя, доки функція не повернеться. Якщо немає місця для створення нових об'єктів, він кидаєjava.lang.StackOverFlowError. Сфера застосування елементів обмежена їх потоками. The JVM створює окремий стек для кожного потоку.

Пам'ять купи

Він створюється під час запуску JVM і використовується програмою, поки програма працює. Він зберігає об’єкти та класи JRE. Щоразу, коли ми створюємо об’єкти, вони займають місце в пам’яті купи, тоді як посилання на цей об’єкт створюється в стеку. Він не дотримується жодного порядку, як стек. Він динамічно обробляє блоки пам'яті. Це означає, що нам не потрібно обробляти пам'ять вручну. Для автоматичного керування пам’яттю Java забезпечує збирач сміття, який видаляє об’єкти, які більше не використовуються. Пам'ять, виділена для купи, живе до тих пір, поки не відбудеться будь-яка подія, або завершення програми, або звільнення пам'яті. Елементи глобально доступні в додатку. Це загальний простір пам'яті, спільний для всіх потоків. Якщо простір купи заповнений, він викидаєjava.lang.OutOfMemoryError. Пам'ять купи далі розділена на такі області пам'яті:

  • Молоде покоління
  • Космос вижив
  • Старе покоління
  • Постійне покоління
  • Кеш коду

На наступному зображенні показано розподіл стекової пам’яті та простору купи.

Стек проти купи Java

Різниця між стековою та куповою пам’яттю

У наведеній нижче таблиці підсумовано всі основні відмінності між пам’яттю стека та простором купи.

Параметр Стекова пам'ять Купа простору
застосування У ньому зберігаються предмети, які мають дуже короткий термін служби, наприклад методи, змінні, і довідкові змінні об'єктів. Він зберігає об'єктів і Java Runtime Environment ( JRE ) класи.
Замовлення Це слідує за ЛІФО порядок. Він не дотримується жодного порядку, оскільки це динамічний розподіл пам’яті та не має фіксованого шаблону для виділення та звільнення блоків пам’яті.
Гнучкість Це є не гнучкий тому що ми не можемо змінити виділену пам'ять. Це є гнучкий тому що ми можемо змінити виділену пам'ять.
Ефективність Це має швидше доступ, розподіл і зняття. Це має повільніше доступ, розподіл і зняття.
Розмір пам'яті Це є менше за розміром. Це є більший за розміром.
Використані параметри Java Ми можемо збільшити розмір стека за допомогою параметра JVM -Xss. Ми можемо збільшити або зменшити розмір пам’яті купи за допомогою параметрів - Xmx і -Xms JVM.
Видимість або область Змінні видимі лише для потоку-власника. Його бачать усі ланцюжки.
Покоління космосу Коли потік створюється, операційна система автоматично виділяє стек. Щоб створити простір купи для програми, мова спочатку викликає операційну систему під час виконання.
Розподіл Для кожного об'єкта створюється окремий стек. Він ділиться між усіма потоками.
Кидки винятків JVM кидає java.lang.StackOverFlowError якщо розмір стека перевищує обмеження. Щоб уникнути цієї помилки, збільште розмір стека. JVM кидає java.lang.OutOfMemoryError якщо JVM не може створити новий рідний метод.
Розподіл/ Звільнення Це робиться автоматично компілятор . Це робиться вручну програміст .
Вартість Його вартість становить менше . Його вартість становить більше у порівнянні зі стеком.
Реалізація Його реалізація є важко . Його реалізація є легко .
Порядок виділення Розподіл пам'яті є безперервний . Пам'ять, виділена в випадковий порядок.
Thread-Safety Це потокобезпечно, тому що кожен потік має власний стек. Він небезпечний для потоків, тому необхідна правильна синхронізація коду.