Sobes.tech
Middle

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:

  1. 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.

  2. Á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.

  3. 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...
}