Jakie są fazy czyszczenia zasobów w zarządzaniu pamięcią?
sobes.tech AI
Odpowiedź od AI
Zarządzanie pamięcią w .NET obejmuje następujące fazy czyszczenia zasobów:
-
Faza oznaczania (Marking): Zbieracz śmieci określa, które obiekty są dostępne z obiektów korzeniowych (zmienne stosu, zmienne statyczne i rejestry). Obiekty niedostępne są oznaczane do zbiórki.
-
Faza przemieszczania (Relocating/Compacting): Dostępne obiekty są przemieszczane (upakowywane) w pamięci, zwalniając ciągłą przestrzeń i zmniejszając fragmentację. Podczas tego procesu aktualizowane są wskaźniki na przemieszczone obiekty. Ta faza występuje tylko w wersjach innych niż w tle.
-
Faza sprzątania (Sweeping): Wywoływane są metody końcowe (
Finalize) obiektów oznaczonych do zbiórki, jeśli są zdefiniowane. Następnie zwalniana jest pamięć zajmowana przez te obiekty.
Przykład użycia Finalize (niezalecane, lepiej używać IDisposable):
public class ResourceHolder
{
// Zasób wymagający zwolnienia
private System.IO.StreamWriter _writer;
public ResourceHolder(string filePath)
{
_writer = new System.IO.StreamWriter(filePath);
}
// Metoda końcowa, wywoływana przez zbieracz śmieci
~ResourceHolder()
{
// Zwolnienie zasobu niezarządzanego
_writer?.Dispose();
}
// Inne metody klasy...
}