Sdílet prostřednictvím


System.GC – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Třída GC řídí uvolňovač paměti. Sběrač paměti je komponenta Common Language Runtime (CLR), která řídí přidělování a uvolňování spravované paměti. Metody v této třídě ovlivňují, kdy se provádí uvolňování paměti u objektu a kdy se uvolňují prostředky přidělené objektem. Vlastnosti v této třídě poskytují informace o celkovém množství paměti dostupné v systému a věkové kategorii nebo generování paměti přidělené objektu.

Systém uvolňování paměti sleduje a recykluje objekty přidělené ve spravované paměti. Garbage collector pravidelně vykonává čištění paměti, aby uvolnil paměť přidělenou objektům, pro které neexistují žádné platné odkazy. Uvolňování paměti probíhá automaticky, když požadavek na paměť nelze splnit pomocí dostupné volné paměti. Případně může aplikace vynutit uvolňování paměti pomocí této metody Collect.

Garbage collection se skládá z následujících kroků:

  1. Systém garbage collector vyhledá spravované objekty, na které odkazuje kód.
  2. Správce paměti se pokouší finalizovat objekty, na které se neodkazuje.
  3. Garbage collector uvolňuje objekty, na které se neodkazuje, a obnovuje jejich paměť.

Nespravované prostředky

Během provádění kolekce nezpracovávač paměti neuvolní objekt, pokud najde jeden nebo více odkazů na tento objekt ve spravovaném kódu. Systém uvolňování paměti však nerozpozná odkazy na objekt z nespravovaného kódu a může uvolnit objekty, které se používají výhradně v nespravovaném kódu, pokud tomu není explicitně zabráněno. Tato KeepAlive metoda poskytuje mechanismus, který zabrání garbage collectoru ve shromažďování objektů, které se stále používají v nespravovaném kódu.

Kromě přidělování spravované paměti neudržují implementace správy paměti informace o prostředcích uchovávaných objektem, jako jsou popisovače souborů nebo připojení k databázi. Pokud typ používá nespravované prostředky, které musí být uvolněny před tím, než jsou instance typu zrušeny, může typ implementovat finalizátor.

Ve většině případů jsou finalizátory implementovány přepsáním Object.Finalize metody; typy napsané v jazyce C# nebo C++ implementují destruktory, které kompilátory změní na přepsání Object.Finalize. Ve většině případů, pokud má objekt finalizátor, garbage collector ho zavolá před uvolněním objektu. Nicméně systém uvolňování paměti nemusí volat finalizátory ve všech situacích; metoda například SuppressFinalize explicitně zabraňuje zavolání finalizátoru objektu. Také garbage collector není povinen použít konkrétní vlákno k dokončení objektů ani zaručit pořadí volání finalizérů u objektů, které se vzájemně odkazují, ale jsou jinak k dispozici pro uvolnění paměti.

Ve scénářích, kdy je nutné uvolnit prostředky v určitou dobu, mohou třídy implementovat IDisposable rozhraní, které obsahuje metodu IDisposable.Dispose pro správu a úklid prostředků. Třídy, které implementují Dispose, musí ve svém kontraktu určit, zda a kdy uživatelé třídy volají metodu pro vyčištění objektu. Sběrač paměti ve výchozím nastavení metodu Dispose nevolá; implementace metody Dispose však mohou volat metody ve třídě GC, aby přizpůsobily chování finalizace sběrače paměti.

Další informace o finalizaci objektů a vzoru dispose naleznete v tématu Čištění nespravovaných prostředků.

Stárnutí objektů a generace

Garbage collector v CLR (Common Language Runtime) podporuje stárnutí objektů pomocí generací. Generování je měrná jednotka relativního stáří objektů v paměti. Číslo generování nebo stáří objektu označuje generaci, do které objekt patří. Objekty vytvořené v poslední době jsou součástí novějších generací a mají nižší čísla generace než objekty vytvořené dříve v životním cyklu aplikace. Objekty v nejnovější generaci jsou v generaci 0. Tato implementace sběrače paměti podporuje tři generace objektů, generace 0, 1 a 2. Můžete načíst hodnotu MaxGeneration vlastnosti a určit maximální počet generování podporovaný systémem.

Stárnutí objektů umožňuje aplikacím zaměřit uvolňování paměti na konkrétní sadu generací, aniž by bylo nutné, aby garbage collector vyhodnocoval všechny generace. Přetížení metody Collect, která obsahují parametr generation, umožňují určit nejstarší generaci, která má být uvolněna z paměti.

Zakázání správy paměti

Sběrač odpadu podporuje režim latence bez oblasti GC, který lze využít během provádění kritických úseků, kde sběr odpadu může nepříznivě ovlivnit výkon aplikace. Režim latence oblasti bez uvolňování paměti vyžaduje, abyste zadali množství paměti, které lze přidělit bez rušení správce paměti. Pokud modul runtime může přidělit tuto paměť, modul runtime neprovádí uvolňování paměti, zatímco se spouští kód v kritické cestě.

Začátek kritické dráhy oblasti bez GC definujete voláním jednoho z přetížení TryStartNoGCRegion. Konec kritické cesty zadáte voláním EndNoGCRegion metody.

Volání metody TryStartNoGCRegion nelze vnořit a metodu EndNoGCRegion byste měli volat pouze v případě, že modul runtime není aktuálně v režimu latence oblasti GC. Jinými slovy, neměli byste volat TryStartNoGCRegion vícekrát (po prvním volání metody, následná volání nebudou úspěšná) a neměli byste očekávat, že volání budou EndNoGCRegion úspěšná pouze proto, že první volání bylo TryStartNoGCRegion úspěšné.