Megosztás a következőn keresztül:


System.GC osztály

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

Az GC osztály vezérli a szemétgyűjtőt. A szemétgyűjtő egy közös nyelvi futtatókörnyezeti összetevő, amely szabályozza a felügyelt memória lefoglalását és kiadását. Az osztály metódusai befolyásolják, hogy a szemétgyűjtés mikor történik egy objektumon, és mikor szabadulnak fel az objektumok által lefoglalt erőforrások. Az osztály tulajdonságai információt nyújtanak a rendszerben rendelkezésre álló memória teljes mennyiségéről, valamint az objektumhoz lefoglalt memória korkategóriájáról vagy generációjáról.

A szemétgyűjtő nyomon követi és visszaköveti a felügyelt memóriában lefoglalt objektumokat. A szemétgyűjtő rendszeresen végez szemétgyűjtést, hogy visszanyerje azoknak az objektumoknak a memóriáját, amelyekre nincsenek érvényes hivatkozások. A szemétgyűjtés automatikusan történik, ha egy memóriakérés nem teljesíthető a rendelkezésre álló szabad memória használatával. Másik lehetőségként egy alkalmazás kényszerítheti a szemétgyűjtést a Collect módszerrel.

A szemétgyűjtés a következő lépésekből áll:

  1. A szemétgyűjtő felügyelt kódban hivatkozott felügyelt objektumokat keres.
  2. A szemétgyűjtő megpróbálja véglegesíteni a nem hivatkozott objektumokat.
  3. A szemétgyűjtő felszabadítja a nem hivatkozott objektumokat, és visszanyeri a memóriájukat.

Nem felügyelt erőforrások

A gyűjtemény során a szemétgyűjtő nem szabadít fel objektumot, ha egy vagy több, felügyelt kódban lévő objektumra mutató hivatkozást talál. A szemétgyűjtő azonban nem ismeri fel a nem felügyelt kódból származó objektumokra mutató hivatkozásokat, és olyan objektumokat szabadíthat fel, amelyeket kizárólag nem felügyelt kódban használnak, kivéve, ha ez kifejezetten megakadályozza. A KeepAlive metódus olyan mechanizmust biztosít, amely megakadályozza, hogy a szemétgyűjtő összegyűjtse a nem felügyelt kódban még használatban lévő objektumokat.

A felügyelt memórialefoglalásokon kívül a szemétgyűjtő implementációi nem tárolnak információkat az objektumok által tárolt erőforrásokról, például fájlleírókról vagy adatbázis-kapcsolatokról. Ha egy típus nem felügyelt erőforrásokat használ, amelyeket a típus példányainak visszaigénylése előtt ki kell szabadítani, a típus implementálhat egy véglegesítőt.

A legtöbb esetben a véglegesítők a metódus felülbírálásával Object.Finalize kerülnek implementálásra. A C# vagy C++ nyelven írt típusok azonban destruktorokat implementálnak, amelyek a fordítók felülbírálásává Object.Finalizealakulnak. A legtöbb esetben, ha egy objektum rendelkezik véglegesítővel, a szemétgyűjtő meghívja azt az objektum felszabadítása előtt. A szemétgyűjtőnek azonban nem kell minden helyzetben véglegesítőket hívnia; a metódus például kifejezetten megakadályozza az SuppressFinalize objektum véglegesítőjének meghívását. Emellett a szemétgyűjtőnek nem kell egy adott szálat használnia az objektumok véglegesítéséhez, vagy garantálnia kell, hogy a véglegesítők milyen sorrendben legyenek meghívva az egymásra hivatkozó, de a szemétgyűjtéshez egyébként elérhető objektumokhoz.

Azokban az esetekben, amikor az erőforrásokat egy adott időpontban kell felszabadítani, az osztályok implementálhatják az IDisposable interfészt, amely tartalmazza az IDisposable.Dispose erőforrás-kezelési és -tisztítási feladatokat végző metódust. A megvalósító Dispose osztályoknak az osztályszerződés részeként meg kell adniuk, hogy az osztályfelhasználók meghívják-e a metódust az objektum eltávolítására. A szemétgyűjtő alapértelmezés szerint nem hívja meg a Dispose metódust, a metódus implementációi Dispose azonban meghívhatnak metódusokat az osztályban a GC szemétgyűjtő véglegesítési viselkedésének testreszabásához.

Az objektum véglegesítéséről és a megsemmisítési mintáról további információt a nem felügyelt erőforrások megtisztítása című témakörben talál.

Objektum öregedése és generációi

A közös nyelvi futtatókörnyezet szemétgyűjtője generációk használatával támogatja az objektumok öregedését. A generáció a memóriában lévő objektumok relatív korának mértékegysége. Az objektum generációszáma vagy életkora azt a generációt jelzi, amelyhez egy objektum tartozik. A legutóbb létrehozott objektumok az újabb generációk részét képezik, és alacsonyabb generációszámmal rendelkeznek, mint az alkalmazás életciklusában korábban létrehozott objektumok. A legutóbbi generáció objektumai a 0. generációsak. A szemétgyűjtő ezen megvalósítása három objektumgenerációt támogat, a 0, az 1 és a 2 generációt. A tulajdonság értékét lekérheti a MaxGeneration rendszer által támogatott maximális generációszám meghatározásához.

Az objektumöregedés lehetővé teszi az alkalmazások számára, hogy a szemétgyűjtést egy adott generációra célják meg, ahelyett, hogy a szemétgyűjtőnek az összes generációt értékelnie kellene. A paramétert generation tartalmazó metódus túlterhelései Collect lehetővé teszik a legrégebbi gyűjtendő generáció megadását.

Szemétgyűjtés letiltása

A szemétgyűjtő nem támogatja a GC régió késési módját, amely olyan kritikus útvonalak végrehajtása során használható, amelyekben a szemétgyűjtés hátrányosan befolyásolhatja az alkalmazás teljesítményét. A nem GC-régió késési módjához meg kell adnia egy memóriamennyiséget, amely a szemétgyűjtő beavatkozása nélkül foglalható le. Ha a futtatókörnyezet lefoglalja ezt a memóriát, a futtatókörnyezet nem hajt végre szemétgyűjtést, miközben a kritikus útvonalon lévő kód végrehajtása folyamatban van.

A GC-régió kritikus útvonalának kezdetét úgy határozhatja meg, hogy meghívja a rendszer egyik túlterhelését TryStartNoGCRegion. A metódus meghívásával EndNoGCRegion megadhatja a kritikus elérési út végét.

Nem ágyazhat be hívásokat a TryStartNoGCRegion metódusba, és csak akkor hívja meg a EndNoGCRegion metódust, ha a futtatókörnyezet jelenleg nincs GC-régió késési módban. Más szóval ne hívjon TryStartNoGCRegion többször (az első metódushívás után az azt követő hívások nem fognak sikerülni), és ne várja el, hogy EndNoGCRegion a hívások sikeresek legyenek, csak azért, mert az első hívás TryStartNoGCRegion sikeres volt.