Junior
Какво е събирачът на боклук (Garbage Collector) в C#?
sobes.tech AI
Отговор от AI
В C# събирачът на боклук е част от средата за изпълнение .NET (CLR), която автоматично управлява паметта, освобождавайки ресурси, заети от обекти, които вече не са достъпни.
Принципи на работа:
- Проследяване на обекти: Събирачът на боклук проследява обектите, създадени в управляваната купчина.
- Определяне на достъпността: Той определя кои обекти са достъпни за изпълнявания код (т.е. имат валидни препратки).
- Събиране на недостъпни обекти: Обектите, които вече не са достъпни, се считат за "мръсотия" и могат безопасно да бъдат премахнати.
Процесът на събиране включва:
- Маркиране (Marking). GC сканира стека и регистрите, за да намери корените (кореновите обекти). От корените обхожда графа на обектите и маркира достъпните.
- Компактиране (Compacting). Позволява да се намали фрагментацията на паметта. GC преместват достъпните обекти в непрекъснат блок памет, оставяйки свободно пространство.
- Почистване (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() ще бъде извикано автоматично