Milyen fázisai vannak az erőforrások tisztításának a memória kezelésében?
sobes.tech MI
Válasz az MI-től
A .NET memóriakezelése a következő erőforrás-tisztítási fázisokat foglalja magában:
-
Jelölési fázis (Marking): A szemétgyűjtő meghatározza, hogy mely objektumok érhetők el a gyökérobjektumokból (veremváltozók, statikus változók és regiszterek). Az elérhetetlen objektumokat megjelöli a gyűjtésre.
-
Áthelyezési (összevonási) fázis (Relocating/Compacting): Az elérhető objektumokat mozgatja (összevonja) a memóriában, folyamatos teret szabadítva fel és csökkentve a fragmentációt. Ez a fázis csak háttér nélküli build-ekben van jelen.
-
Tisztítási fázis (Sweeping): A gyűjtésre megjelölt objektumok (
Finalize) metódusait meghívják, ha vannak. Ezután felszabadítja az ezek által foglalt memóriát.
A Finalize használatának példája (nem ajánlott, inkább az IDisposable használata javasolt):
public class ResourceHolder
{
// Erőforrás, amely felszabadítást igényel
private System.IO.StreamWriter _writer;
public ResourceHolder(string filePath)
{
_writer = new System.IO.StreamWriter(filePath);
}
// Finalizáló metódus, amit a szemétgyűjtő hív meg
~ResourceHolder()
{
// Nem kezelt erőforrás felszabadítása
_writer?.Dispose();
}
// Egyéb osztálymetódusok...
}