2. В цьому модулі:
Життєвий цикл об’єктів
Поняття збирача мусору
Деструктор і метод Finalize
Метод Dispose і інтерфейс IDispose
Клас System.GC
Поняття поколінь при збиранні мусору
2
Andrii Hladkyi
trilobt@gmail.com
3. Життєвий цикл об’єктів
Життєвий цикл будь якого об'єкта можна подати так:
◦ виділення пам'яті для типу;
◦ ініціалізація виділеної пам'яті (установка об'єкта в початкове значення,
виклик конструктора);
◦ використання об'єкта в програмі;
◦ руйнація стану об'єкта;
◦ звільнення зайнятої пам'яті.
Управління життєвим циклом об'єктів являє собою важку задачу і є
постійним джерелом помилок. Тому був розроблений автоматичний
механізм управління пам'яттю – збір сміття.
Andrii Hladkyi
trilobt@gmail.com 3
4. Поняття збирача мусору
Збір сміття звільняє програміста від необхідності постійно стежити за
використанням і своєчасним звільненням пам'яті.
Спеціальний код, який здійснює збір сміття називається «збирач сміття» (Garbage
Collector).
Збирач сміття відстежує і знищує об'єкти, що знаходяться в керованої пам'яті.
Збирання сміття автоматично запускається в разі, якщо необхідний обсяг пам'яті
більше доступного обсягу вільної пам'яті. Крім того, програма може примусово
запустити збірку сміття за допомогою методу Collect класу System.GC.
Збирання сміття складається з таких кроків:
Збирач сміття здійснює пошук керованих об'єктів, на які є посилання в
керованому коді.
Збирач сміття намагається завершити об'єкти, на які немає посилань.
Збирач сміття звільняє об'єкти, на які немає посилань, і вивільняє виділену їм
пам'ять.
Andrii Hladkyi
trilobt@gmail.com 4
5. Деструктор і метод Finalize
Збирач сміття вміє автоматично руйнувати прості об'єкти (такі, як
String, Delegate і ін.) І звільняти займану ними пам'ять. Що ж
стосується складних типів, то їх збирач сміття правильно руйнувати не
вміє, і тому необхідно писати спеціальний екземплярний код для
правильного знищення об'єкта.
Для таких типів C# підтримує спеціальний механізм, званий
фіналізацією об'єктів (finalization). Для виконання цього механізму
об'єкт повинен реалізувати однойменний метод (Finalize), який буде
викликаний збирачем сміття безпосередньо перед його знищенням.
В C# для визначення завершувача використовується тильда (~) і ім'я
класу.
Перевантажувати фіналізатор і використовувати в ньому параметри не
можна.
Andrii Hladkyi
trilobt@gmail.com 5
7. Метод Dispose і інтерфейс IDispose
Метод Finalize () безпосередньо викликати не можна - його викликає
Garbage Collector при руйнуванні об'єкта під час збірки сміття.
Для явного звільненні ресурсів потрібно реалізувати інтерфейс
IDisposable, який визначає наявність методу Dispose() у своїх
спадкоємців. Користувач об'єкта повинен викликати цей метод при
завершенні використання об'єкта.
Andrii Hladkyi
trilobt@gmail.com 7
9. Клас System.GC
Клас, що представляє збирач сміття, називається
System.GC. Методи цього класу впливають на те,
коли виконується збірка сміття і коли вивільняються
ресурси, виділені об'єкту.
Andrii Hladkyi
trilobt@gmail.com 9
11. Поняття поколінь при збиранні мусору
Збирач сміття після очищення пам'яті, щоб не допустити фрагментації,
«стискає» її, іншими словами, він «зсуває» всі об'єкти так, щоб вони
розташовувалися послідовно.
Як показали дослідження, велика частина об'єктів, які створені недавно,
швидко стають недосяжними. Тому керована купа була розділена на 3
покоління: 0, 1 і 2. Розмір пам'яті під кожне з поколінь різний - він
збільшується з ростом номера покоління.
Всі новостворені об'єкти потрапляють в перше (0) покоління. Збір сміття
автоматично викликається по закінченню пам'яті в одному з поколінь
Об'єкти, які пережили збір сміття, переходять в наступне покоління.
Даний підхід дозволяє дуже швидко очищати пам'ять: чим менше розмір
покоління, тим швидше проходять операції по дефрагментації пам'яті.
Andrii Hladkyi
trilobt@gmail.com 11