Sobes.tech
Junior

Какво е събирачът на боклук (Garbage Collector) в C#?

sobes.tech AI

Отговор от AI

В C# събирачът на боклук е част от средата за изпълнение .NET (CLR), която автоматично управлява паметта, освобождавайки ресурси, заети от обекти, които вече не са достъпни.

Принципи на работа:

  • Проследяване на обекти: Събирачът на боклук проследява обектите, създадени в управляваната купчина.
  • Определяне на достъпността: Той определя кои обекти са достъпни за изпълнявания код (т.е. имат валидни препратки).
  • Събиране на недостъпни обекти: Обектите, които вече не са достъпни, се считат за "мръсотия" и могат безопасно да бъдат премахнати.

Процесът на събиране включва:

  1. Маркиране (Marking). GC сканира стека и регистрите, за да намери корените (кореновите обекти). От корените обхожда графа на обектите и маркира достъпните.
  2. Компактиране (Compacting). Позволява да се намали фрагментацията на паметта. GC преместват достъпните обекти в непрекъснат блок памет, оставяйки свободно пространство.
  3. Почистване (Sweeping). Недостъпните обекти (немаркираните) се премахват, а паметта им се освобождава.

Основни характеристики:

  • Автоматично управление: Премахва ръчната отговорност на разработчика за освобождаване на паметта.
  • Поколения: Купчината е разделена на поколения (Gen 0, Gen 1, Gen 2). Това оптимизира събирането, тъй като повечето обекти бързо стават боклук. Новите обекти се създават в Gen 0. Ако обект оцелее след събиране в Gen 0, той се премества в Gen 1 и така нататък.
  • Финализатори и освобождаване (Finalizers and Disposal): GC не гарантира незабавното изпълнение на финализаторите за обекти, реализиращи IDisposable. За освобождаване на unmanaged ресурси трябва да се използва явен механизъм (Dispose(), изказване using).
// Пример за използване на изказването using за явното освобождаване на ресурси
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // Работа с файла
} // stream.Dispose() ще бъде извикано автоматично