JavaRush /Java блог /Random UA /Вчимося гуглити | 4 рівень | 11 лекція
sunshine4545
41 рівень
Минск

Вчимося гуглити | 4 рівень | 11 лекція

Стаття з групи Random UA
Вчимося гуглити |  4 рівень |  11 лекція - 1

1. Як працює збирач сміття в Java

Складальник сміття — це низькопріоритетний процес, який періодично запускається і звільняє пам'ять, використану об'єктами, які більше не потрібні. Складальник сміття працює у фоновому режимі, паралельно з програмою, в окремому потоці. Основа для складання сміття не підрахунок посилань, а поділ об'єктів на два види – досяжні та недосяжні. Об'єкт вважається досяжним (живим), якщо його посилається інший досяжний (живий) об'єкт. Досяжність вважається від ниток. Нитки, що працюють, завжди вважаються досяжними (живими), навіть якщо на них ніхто не посилається. Усі об'єкти в Java зберігаються у спеціальній області пам'яті, що називається купа (heap). Всі об'єкти в програмах можна розділити на два типи - умовно кажучи, прості об'єкти та "довгожителі". "Довгожителі" вважаються об'єкти, що пережабо багато складання сміття. Найчастіше вони існуватимуть до кінця роботи програми. У результаті загальна купа, де зберігаються всі створені об'єкти, було поділено кілька частин. Перша частина має гарну назву - Eden (бібл. "Райський сад"), сюди об'єкти потрапляють після їх створення. Саме в цій частині виділяється пам'ять нових об'єктів, коли ми пишемо new. Об'єктів може створити багато, і коли в цій області закінчується місце, починається перше, "швидке" складання сміття. Треба сказати, що збирач сміття дуже розумний і вибирає алгоритм роботи в залежності від того, чого в купі більше – сміття чи робочих об'єктів. Якщо майже всі об'єкти є сміттям, збирач позначає "живі" об'єкти і переносить їх в іншу область пам'яті, після чого поточна область повністю очищається. Якщо ж сміття мало і більшість займають живі об'єкти, він позначає сміття, очищає його, інші об'єкти компонує. Область пам'яті, куди переносяться всі об'єкти, що пережабо хоча б одну збірку сміття, називається Survival Space (місце для тих, хто вижив). Survival Space своєю чергою ділиться на покоління. Кожен об'єкт відноситься до свого покоління залежно від того, скільки зборів сміття він пережив. Якщо одну - він відноситься до "Покоління 1", якщо 5 - до "Покоління 5". Водночас Eden та Survival Space утворюють область під назвою Young Generation (“молоде покоління”). Крім Young Generation у купі існує й інша область пам'яті - Old Generation (старе покоління). Сюди саме потрапляють ті самі об'єкти-довгожителі, які пережабо багато сміття. Їх вигідніше зберігати окремо від решти. І коли область Old Generation заповнена, тобто. навіть об'єктів-довгожителів у програмі так багато, що пам'яті не вистачає, проводиться повне прибирання сміття. Вона обробляє не одну область пам'яті, а взагалі всі створені Java-машиною об'єкти. Звичайно, вона займає набагато більше часу та ресурсів. Саме тому об'єкти-довгожителі було вирішено зберігати окремо. Коли місце закінчується в інших областях, проводиться так зване "швидке складання сміття". Вона охоплює лише одну область, і за рахунок цього є більш економічною та швидкою. В кінці, коли забита вже навіть область для довгожителів, у бій вступає повне прибирання. Таким чином, "важковаговий" інструмент використовується збирачем тільки тоді, коли без цього вже не обійтися. Вчимося гуглити |  4 рівень |  11 лекція - 2

2. Які бувають види збирачів сміття

Java має seve types of garbage collectors:
  1. Serial Garbage Collector
  2. Parallel Garbage Collector
  3. CMS Garbage Collector
  4. G1 Garbage Collector
  5. Epsilon Garbage Collector
  6. Z garbage collector
  7. Shenandoah Garbage Collector

3. Що таке «покоління» об'єктів

Усі об'єкти в Survival Space поділяються на покоління. Кожен об'єкт відноситься до свого покоління залежно від того, скільки зборів сміття він пережив. Якщо одну - він відноситься до "Покоління 1", якщо 5 - до "Покоління 5".

4. Для чого використовується SoftReference

Об'єкт, на який посилаються тільки м'які посилання, може бути видалено збирачем сміття, якщо програмі не вистачає пам'яті. Якщо програмі раптом не вистачає пам'яті, перш ніж викинути OutOfMemoryException, збирач сміття видаляє всі об'єкти, на які посилаються м'які посилання та спробує виділити програмі ще раз. Об'єкт, який утримує від смерті тільки SoftReference може пережити скільки завгодно складання сміття і швидше за все, буде знищений при нестачі програми пам'яті.

5. Приклад використання SoftReference

SoftReference були спеціально розроблені для кешування. Припустимо, що програма-клієнт часто запитує у програми-сервера різні дані. Тоді програма сервер може деякі з них кешувати, скориставшись для цього SoftReference. Якщо об'єкти, які утримуються від смерті м'якими посиланнями, займатиме більшу частину пам'яті, то збирач сміття просто їх видаляє і все.

6. Приклад використання WeakReference

Якщо на об'єкт залишабося лише слабкі посилання, то цей об'єкт є живим, але він буде знищений під час найближчого складання сміття. Об'єкт, який утримує від смерті тільки WeakReference не переживає найближчого складання сміття. Але поки вона не відбулася, його можна отримати, викликавши метод get()у WeakReference і викликати його методи або зробити щось ще. Приклад використання WeakReference – WeakHashMap.

7. Навіщо потрібний WeakHashMap

WeakHashMap – це HashMap, у якого ключі – це слабкі посилання – WeakReference. Ти зберігаєш у WeakHashMap пари об'єктів – ключ та значення. Але WeakHashMap посилається на ключі не прямо, а через WeakReference. Тому, коли об'єкти, які використовуються як ключі, стануть слабодосяжними, вони знищаться при найближчому збиранні сміття. Отже, з WeakHashMap автоматично віддаляться і їх значення. У WeakHashMap дуже зручно зберігати додаткову інформацію до якихось об'єктів. По-перше, її дуже легко отримати, якщо використовувати сам об'єкт як ключ. По-друге, якщо об'єкт буде знищений, з HashMap зникне і він, і всі дані, що прив'язані до нього. Наприклад, у програмі є нитка, яка відстежує роботу деяких об'єктів-завдань і пише інформацію про них у лог. Тоді ця нитка може зберігати об'єкти, що відстежуються, в такому WeakHashMap. Як тільки об'єкти стануть не потрібні, збирач сміття видаляє їх, автоматично віддаляться і посилання на них із WeakHashMap.

8. Що таке логер

Logger object використовується як log messages для конкретної системи або application component. Лог – це список подій, що відбулися. Найчастіше в балку пишеться інформація про параметри методу, з якими він був викликаний, всі перехоплені помилки, і ще багато проміжної інформації. Весь процес логування складається із трьох частин.
  • Перша частина – це збирання інформації.
  • Друга частина – це фільтрування зібраної інформації.
  • Третя частина – це запис відібраної інформації.

9. Як настроїти логер

  1. До pom.xml додати залежність.
  2. Додати до файлів resources log4j.properties.
    Зазвичай параметри логгера log4j задаються у файлі log4j.properties. У цьому файлі можна задати кілька appender'ів - об'єктів, в які будуть писати дані.
  3. Додати до класу з бізнес-логікою private static final Logger log = Logger.getLogger(ххх.class);.
Використовувалося:
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ