logo

Керування пам'яттю в Java

У Java керування пам’яттю – це процес виділення та скасування виділення об’єктів, що називається керуванням пам’яттю. Java керує пам'яттю автоматично. Java використовує автоматичну систему керування пам'яттю під назвою a збирач сміття . Таким чином, нам не потрібно впроваджувати логіку керування пам’яттю в нашій програмі. Управління пам'яттю Java ділиться на дві основні частини:

    Структура пам'яті JVM Робота збирача сміття

Структура пам'яті JVM

JVM створює різні області даних під час виконання в купі. Ці області використовуються під час виконання програми. Області пам’яті знищуються, коли JVM виходить, тоді як області даних знищуються, коли потік виходить.

Управління пам'яттю в Java

Область методу

Область методів — це частина пам’яті купи, яка використовується спільно для всіх потоків. Він створюється під час запуску JVM. Він використовується для зберігання структури класу, імені суперкласу, імені інтерфейсу та конструкторів. JVM зберігає такі види інформації в області методів:

  • Повна назва типу (наприклад, рядок)
  • Модифікатори типу
  • Пряме ім'я суперкласу типу
  • Структурований список повних імен суперінтерфейсів.

Площа купи

У купі зберігаються фактичні об’єкти. Він створюється під час запуску JVM. При необхідності користувач може контролювати купу. Він може мати фіксований або динамічний розмір. Коли ви використовуєте нове ключове слово, JVM створює екземпляр для об’єкта в купі. Поки посилання на цей об’єкт зберігається в стеку. Для кожного запущеного процесу JVM існує лише одна купа. Коли купа заповнюється, сміття збирають. Наприклад:

 StringBuilder sb= new StringBuilder(); 

Наведений вище оператор створює об’єкт класу StringBuilder. Об’єкт розподіляє в купу, а посилання sb виділяє в стек. Купа ділиться на такі частини:

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

Тип посилання

Є чотири типи посилань: Сильний , Слабкий , М'які , і Фантомна довідка . Різниця між типами посилань полягає в тому, що об’єкти в купі, на які вони посилаються, придатні для збирання сміття за різними критеріями.

Сильна посилання: Це дуже просто, оскільки ми використовуємо його в нашому щоденному програмуванні. Будь-який об’єкт, до якого приєднано сильне посилання, не підходить для збирання сміття. Ми можемо створити надійне посилання, використовуючи такий оператор:

 StringBuilder sb= new StringBuilder(); 

Слабке посилання: Він не виживає після чергового процесу збору сміття. Якщо ми не впевнені, коли дані запитуватимуться знову. У цій умові ми можемо створити слабке посилання на нього. У випадку, якщо збирач сміття обробляє, він знищує об'єкт. Коли ми знову намагаємося отримати цей об’єкт, ми отримуємо нульове значення. Це визначено в java.lang.ref.WeakReference клас. Ми можемо створити слабке посилання, використовуючи такий оператор:

 WeakReference reference = new WeakReference(new StringBuilder()); 

М'яке посилання: Він збирається, коли програмі бракує пам’яті. Сміттєзбірник не збирає важкодоступні предмети. Усі м’які об’єкти, на які посилаються, збираються до того, як вони викинуть OutOfMemoryError. Ми можемо створити м’яке посилання, використовуючи такий оператор:

 SoftReference reference = new SoftReference(new StringBuilder()); 

Посилання на фантом: Він доступний у java.lang.ref пакет. Це визначено в java.lang.ref.PhantomReference клас. Об’єкт, який має лише фантомне посилання, що вказує на нього, можна зібрати щоразу, коли збирач сміття захоче зібрати. Ми можемо створити фантомне посилання, використовуючи такий оператор:

 PhantomReference reference = new PhantomReference(new StringBuilder()); 

Область стека

Область стека створюється, коли створюється потік. Він може мати фіксований або динамічний розмір. Пам'ять стека виділяється для кожного потоку. Він використовується для зберігання даних і часткових результатів. Він містить посилання на об’єкти купи. Він також містить саме значення, а не посилання на об’єкт із купи. Змінні, які зберігаються в стеку, мають певну видимість, яка називається областю видимості.

центральне зображення в css

Стековий кадр: Фрейм стека — це структура даних, яка містить дані потоку. Дані потоку представляють стан потоку в поточному методі.

  • Він використовується для зберігання часткових результатів і даних. Він також виконує динамічне зв’язування, повертає значення методами та надсилає винятки.
  • Коли метод викликається, створюється новий кадр. Він руйнує фрейм, коли виклик методу завершується.
  • Кожен кадр містить власний масив локальних змінних (LVA), стек операндів (OS) і дані кадру (FD).
  • Розміри LVA, OS і FD визначаються під час компіляції.
  • Тільки один кадр (кадр для виконання методу) є активним у будь-якій точці даного потоку керування. Цей кадр називається поточним кадром, а його метод відомий як поточний метод. Клас методу називається поточним класом.
  • Кадр зупиняє поточний метод, якщо його метод викликає інший метод або якщо метод завершується.
  • Фрейм, створений потоком, є локальним для цього потоку і на нього не може посилатися жодний інший потік.

Стек рідних методів

Він також відомий як стек C. Це стек для рідного коду, написаного мовою, відмінною від Java. Java Native Interface (JNI) викликає рідний стек. Продуктивність рідного стеку залежить від ОС.

Реєстри ПК

Кожен потік має пов'язаний з ним регістр програмного лічильника (PC). Реєстр ПК зберігає адресу повернення або рідний покажчик. Він також містить адресу інструкцій JVM, які зараз виконуються.

Робота Garbage Collector

Огляд збирача сміття

Коли програма виконується на Java, вона використовує пам’ять різними способами. Купа - це частина пам'яті, де живуть об'єкти. Це єдина частина пам’яті, яка бере участь у процесі збирання сміття. Його також називають сміттєвою купою. Увесь збір сміття гарантує, що купа має якомога більше вільного місця. Функція збирача сміття полягає в пошуку та видаленні об'єктів, до яких неможливо дістатися.

Розподіл об'єктів

Коли об’єкт розподіляє, JRockit JVM перевіряє розмір об’єкта. Він розрізняє дрібні та великі предмети. Малий і великий розмір залежить від версії JVM, розміру купи, стратегії збирання сміття та використовуваної платформи. Розмір об’єкта зазвичай становить від 2 до 128 Кб.

вирівнювання зображень в css

Невеликі об’єкти зберігаються в локальній області потоку (TLA), яка є вільною частиною купи. TLA не синхронізується з іншими потоками. Коли TLA заповнюється, він запитує новий TLA.

З іншого боку, великі об'єкти, які не поміщаються всередині TLA, безпосередньо розподіляються в купу. Якщо потік використовує молодий простір, він безпосередньо зберігається в старому просторі. Великий об’єкт потребує більшої синхронізації між потоками.

Що таке Java Garbage Collector?

JVM керує збирачем сміття. JVM вирішує, коли виконувати збір сміття. Ми також можемо надіслати JVM запит на запуск збирача сміття. Але немає жодної гарантії, що JVM відповідатиме за будь-яких умов. JVM запускає збирач сміття, якщо виявляє, що пам’яті мало. Коли програма Java запитує збирач сміття, JVM зазвичай виконує запит у короткий термін. Це не гарантує, що запити приймаються.

Важливо зрозуміти, що ' коли об'єкт стає придатним для збору сміття? '

Команда запуску Linux

Кожна програма Java має більше одного потоку. Кожен потік має свій стек виконання. У програмі Java є потік для запуску, який є методом main(). Тепер ми можемо сказати, що об’єкт придатний для збирання сміття, якщо жоден живий потік не може отримати до нього доступ. Збирач сміття вважає цей об’єкт придатним для видалення. Якщо програма має посилальну змінну, яка посилається на об’єкт, ця посилальна змінна доступна для живого потоку, цей об’єкт називається доступний .

Тут виникає питання, що ' Чи може програмі Java бракувати пам’яті? '

Відповідь - так. Система збирання сміття намагається видалити об’єкти з пам’яті, коли вони не використовуються. Хоча, якщо ви підтримуєте багато активних об’єктів, збирання сміття не гарантує, що пам’яті достатньо. Ефективно керуватиметься лише доступною пам’яттю.

Види збору сміття

Існує п'ять типів збору сміття:

    Послідовний GC:Він використовує підхід оцінки та розгортки для молодих і старих поколінь, який є другорядним і основним GC.Паралельний GC:Він схожий на послідовний GC, за винятком того, що він породжує N (кількість ядер процесора в системі) потоків для збирання сміття молодого покоління.Паралельний старий GC:Він схожий на паралельний GC, за винятком того, що він використовує кілька потоків для обох поколінь.Збирач паралельних позначок (CMS):Він збирає сміття для старого покоління. Ви можете обмежити кількість потоків у колекторі CMS за допомогою XX:ParalleCMSThreads=опція JVM . Він також відомий як паралельний колектор із низькою паузою.Збирач сміття G1:Він представлений у Java 7. Його мета — замінити колектор CMS. Це паралельний, одночасний і CMS-колектор. Немає простору для молодих і старих поколінь. Він ділить купу на кілька однакових за розміром куп. Спочатку він збирає регіони з меншою кількістю поточних даних.

Алгоритм позначення та розгортки

JRockit JVM використовує алгоритм позначення та очищення для збирання сміття. Він містить дві фази: фазу позначки та фазу розгортки.

Позначити фазу: Об’єкти, які доступні з потоків, власних дескрипторів та інших кореневих джерел GC, позначаються як активні. Кожне дерево об’єктів має більше ніж один кореневий об’єкт. Корінь GC завжди доступний. Отже, будь-який об’єкт, у корені якого є корінь збору сміття. Він ідентифікує та маркує всі об’єкти, які використовуються, а решта можна вважати сміттям.

Керування пам'яттю в Java

Фаза розгортки: На цьому етапі купа обходиться, щоб знайти проміжок між живими об’єктами. Ці прогалини записуються у вільний список і доступні для розміщення нового об’єкта.

Є дві покращені версії позначення та розгортки:

перемикач програмування на java
    Одночасна позначка та розгортка Паралельна позначка та розгортка

Одночасна позначка та розгортка

Це дозволяє потокам продовжувати працювати під час великої частини збирання сміття. Розрізняють наступні види маркування:

    Початкове маркування:Він визначає кореневий набір живих об'єктів. Це робиться під час призупинення потоків.Одночасне маркування:У цьому маркуванні дотримується посилання з кореневого набору. Він знаходить і позначає решту живих об'єктів у купі. Це робиться під час роботи потоку.Розмітка перед очищенням:Він визначає зміни, внесені паралельним маркуванням. Інші живі об'єкти позначені та знайдені. Це робиться під час виконання потоків.Фінальна розмітка:Він визначає зміни, внесені маркуванням перед очищенням. Інші живі об'єкти позначені та знайдені. Це робиться під час призупинення потоків.

Паралельна позначка та розгортка

Він використовує весь доступний ЦП у системі для виконання збирання сміття якомога швидше. Його також називають паралельним збирачем сміття. Потоки не виконуються, коли виконується паралельне збирання сміття.

Плюси Mark і Sweep

  • Це повторюваний процес.
  • Це нескінченний цикл.
  • Під час виконання алгоритму додаткові накладні витрати не допускаються.

Мінуси Mark і Sweep

  • Він зупиняє нормальне виконання програми під час роботи алгоритму збирання сміття.
  • Він виконується кілька разів у програмі.