Що таке Java Garbage Collector?

Збирач сміття - це демонова нитка, яка звільняє пам’ять під час виконання. Збір сміття також може бути виражений як переробка пам'яті. Здебільшого в JVM використовується колектор для сміття Oracle Hotspot через свою ефективність. Область пам'яті в JVM, де створюються об'єкти, називається купами. Купа ділиться на дві частини:

  1. Космос молодого покоління
  2. Старий / прострочений космос покоління

Молоде покоління знову ділиться на 3 частини

  1. Едемський простір
  2. Вцілілий від
  3. Вцілілий до

Більш глибоке пояснення було дано в наступних пунктах. Наприклад, якщо ви створили кеш у своїй програмі і якщо об'єкт кешу пережив багато циклів GC, він переходить у старе покоління. GC шукає об'єкти, які більше не потрібні програмі, і знищує їх.

Чому збирач сміття?

До Java дві найпопулярніші мови були C та C ++. У C ми натрапили на calloc (), malloc (), realloc (), який виділить буферну пам'ять, а в C ++ - деструктори. Усі ці функції призначені для функції, що називається управління пам'яттю. Java забезпечує збирання сміття як автоматичне управління пам’яттю з двох основних причин:

  • Деякі створені об'єкти стають недосяжними
  • Посилання зі старих об'єктів на молоді об’єкти існують лише у невеликій кількості.

Найкраща практика використання сміттєзбірника - встановити прапори на JVM.

Дозвольте навести приклад для недосяжних об’єктів

//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code

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

Функції у сміттєзбірнику

  • Позначити: починається з кореневого вузла вашої програми (головного), ходить по графіку об'єктів, позначає об'єкти, які доступні як життя.
  • Видалити / підмітати: видалення недоступних об'єктів. Коли GC видаляє об'єкти, він створює дірку в купі, роблячи її непослідовною. Таким чином, використовується ущільнення.
  • Ущільнення: Ущільнюйте пам’ять, переміщуючи об’єкти та маркуючи розподіл безперервно, ніж фрагментарно. Це трудомістке завдання.

Як працює Java Garbage Collector?

  • Існує два типи об'єктів:

Живі об'єкти: доступні (посилання на інший об’єкт)

Мертві об'єкти: недоступні (не посилаються ніде)

  • Усі новостворені об’єкти створюються в просторі Едему (простір молодого покоління).
  • Після того, як простір Едему заповниться, на простір молодого покоління запускається програма minorGC (), яка відмічає всі невикористані або мертві об'єкти та видаляє їх із пам'яті.
  • Об'єкти, які пережили цей цикл GC, будуть переміщені в космос Survivor From Space. Повторюється той самий процес, і цього разу, коли об’єкти переміщуються з простору Едему в Survivor З космосу, GC перевіряє, чи є він повним, мертві об’єкти звільнені, а вцілілі об'єкти також будуть переміщені до Survivor.
  • Цей процес повторюється, і коли деякі об'єкти пережили поріг відсутності циклів GC, ці об'єкти переміщуються до простору Старого покоління.
  • У цьому випадку JVM запускає функцію majorGC (), яка працює через повний простір купи, ідентифікує / відмічає невикористані (нульові або мертві) об'єкти та змінює всі ці об'єкти.
  • Пам'ятайте, що підмітання об'єктів з купи місця створить отвори в пам'яті, що спричинить витік пам'яті. Щоб уникнути такого сценарію, сміттєзбірник здійснює ущільнення простору пам'яті

Приклади збирача сміття на Яві

Приклад system.gc ():

class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)

Вихід:

Об'єкт

Пояснення вищевказаного коду

  • У наведеному вище коді два об'єкти obj1 і obj2 вказують на null, тому вони зберігаються в просторі Eden з нульовими та невизначеними значеннями
  • Система gc () викликає демонову нитку збору сміття, і обидва об'єкти будуть видалені з простору.

Мінуси та мінуси

Нижче наведено кілька плюсів і мінусів Java Garbage Collector:

Плюси gc:

  • Збір сміття підвищує ефективність пам’яті, оскільки видалить усі невикористані та нульові об’єкти
  • Збір сміття - це автоматичний процес, тому розробник може не подбати про нього, оскільки іншими мовами без сміттєзбірника програміст повинен піклуватися про невловиму проблему пам'яті.

Мінуси gc:

  • Збирач сміття виконуватиме основну функцію gc, яка буде працювати через весь простір купи, роблячи швидкість програми повільно на кілька секунд.
  • Цей процес піде більше часу на процесор, що робить систему коду повільнішою.
  • Якщо ви працюєте над додатком, який потребує величезної пам’яті, використовуйте прапори JVM.
  • Якщо простір у купі заповнений, а об’єкти неможливо провести пальцем чи додавати далі, Java викидає помилку пам’яті, що сповільнить роботу всієї програми, а також може призвести до витоку пам’яті.

Рекомендовані статті

Це посібник із розділу Що таке збирач сміття Java ?. Тут ми обговорюємо його роботу разом із функціями, прикладом, плюсами та мінусами збирача сміття Java. Ви також можете переглянути наступні статті, щоб дізнатися більше -

  1. Конструктор і деструктор на Java
  2. Деструктор на Java
  3. C # проти продуктивності Java
  4. Що таке JVM?