Посібник зі збору сміття у програмуванні

Що таке збір сміття?

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

Давайте розберемося детальніше. Збір сміття - це процес, при якому програми намагаються звільнити простір пам’яті, який більше не використовується об’єктами.

Збір сміття реалізовано по-різному для кожної мови. У більшості мов програмування високого рівня вбудовано якийсь збір сміття. Мови програмування низького рівня можуть додавати збір сміття через бібліотеки.

Як було сказано вище, кожна мова програмування має свій власний спосіб виконання GC. У програмуванні на С розробники повинні подбати про розподіл пам'яті та вивільнення пам'яті за допомогою функцій malloc () та dealloc (). Але у випадку C # розробникам не потрібно дбати про GC, і це також не рекомендується.

Як відбувається розподіл пам’яті?

У C # розподіл пам’яті об’єктів відбувається в керованій купі, про що піклується CLR (загальномовна середовище виконання). Виділення пам’яті для купи здійснюється за допомогою win32 dll в ОС і так само в C.

Але в C об'єкти розміщуються в пам'яті скрізь, де є вільний простір, який відповідає розміру об'єкта. Також відображення пам'яті працює на основі концепцій Linkedlist. У C # розподіл пам'яті для купи відбувається лінійно, один за одним.

Щоразу, коли створюється новий об'єкт, пам'ять виділяється в купі, а вказівник переміщується на наступну адресу пам'яті. Розподіл пам'яті в C # відбувається швидше, ніж у C. Це пояснюється тим, що в C пам'яті потрібно шукати та розподіляти об'єкт. Тож це займе трохи більше часу, ніж C #.

Покоління в C # GC

У програмуванні .net купа має три покоління, що називаються поколіннями 0, 1 і 2. Покоління 0 спочатку заповнюється, коли створюється новий об'єкт. Потім збирач сміття запускається, коли покоління 0 заповнюється. Новостворені об'єкти розміщуються в поколінні 0.

Під час збирання сміття всі небажані об’єкти знищуються, і пам’ять звільняється та ущільнюється. GC дбає про наведення вказівників звільненої пам'яті, як тільки GC трапляється.

Покоління 1 і 2 містять об’єкти, які мають довший термін служби. GC для поколінь 1 і 2 не відбудеться, доки покоління 0 не матиме достатньої пам'яті для виділення.

Ви не повинні викликати GC програмно. Добре, щоб це відбулося само по собі. GC отримує виклик, коли покоління 0 заповнюється.

Плюси та мінуси GC

Вивіз сміття - це інструмент, який економить час для програмістів. Наприклад, він замінює потребу в таких функціях, як malloc () та free (), які містяться в C. Це також може допомогти запобігти витоку пам'яті.

Недоліком збору сміття є те, що це негативно впливає на продуктивність. GC повинен регулярно запускати програму, перевіряючи посилання на об'єкти та очищаючи пам'ять. Це забирає ресурси і часто вимагає від програми паузи.

Коли це робити

Якщо об'єкт не має посилань (більше недоступний), тоді він придатний для збору сміття.

Наприклад, у коді Java нижче, об’єкт Thing, на який спочатку посилається „thing1”, має єдине посилання, яке перенаправляється на інший об’єкт у купі. Це означає, що він тоді недосяжний, і його пам’ять буде нерозподілена збирачем сміття.

class Useless { public static void main (String[] args) { Thing thing1 = new Thing(); Thing thing2 = new Thing(); thing2 = thing1; // direct thing2's reference towards thing1 // no references access thing2 } }

Одним із прикладів збору сміття є ARC, скорочення від автоматичного підрахунку посилань. Наприклад, це використовується в Swift. ARC зводиться до відстеження посилань на всі створені об'єкти. Якщо кількість посилань опуститься до 0, об’єкт буде позначено для звільнення.

Більше інформації:

  • //docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - Щоб дізнатися більше про збір сміття