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í systém uvolňování paměti. Uvolňování paměti je součást modulu CLR (Common Language Runtime), která řídí přidělení a uvolnění spravované paměti. Metody v této třídě ovlivňují, když se uvolňování paměti provádí u objektu a při uvolnění prostředků přidělených 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 uvolní objekty přidělené ve spravované paměti. Uvolňování paměti pravidelně provádí uvolňování paměti za účelem uvolnění paměti přidělené 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í Collect této metody.
Uvolňování paměti se skládá z následujících kroků:
- Systém uvolňování paměti vyhledá spravované objekty, na které odkazuje spravovaný kód.
- Uvolňování paměti se pokusí dokončit objekty, na které se neodkazuje.
- Uvolňování paměti uvolní objekty, na které se neodkazuje, a uvolní jejich paměť.
Nespravované prostředky
Během kolekce uvolňování paměti nezačne uvolnit objekt, pokud najde jeden nebo více odkazů na 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 explicitně nebrání. Tato KeepAlive metoda poskytuje mechanismus, který brání uvolňování paměti ve shromažďování objektů, které se stále používají v nespravovaném kódu.
Kromě přidělení spravované paměti implementace uvolňování paměti neudržují informace o prostředcích uchovávané objektem, jako jsou popisovače souborů nebo připojení databáze. Pokud typ používá nespravované prostředky, které musí být vydány před uvolněním instancí typu, 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 objekt má finalizátor, systém uvolňování paměti ho zavolá před uvolněním objektu. Systém uvolňování paměti však nemusí volat finalizátory ve všech situacích; Metoda například SuppressFinalize explicitně zabraňuje zavolání finalizátoru objektu. Také uvolňování paměti není nutné použít konkrétní vlákno k dokončení objektů nebo zaručit pořadí, ve kterém jsou volány finalizační metody pro objekty, které odkazují na sebe, ale jsou jinak k dispozici pro uvolňování paměti.
Ve scénářích, ve kterých musí být prostředky uvolněny v určitém čase, třídy mohou implementovat IDisposable rozhraní, která obsahuje metodu IDisposable.Dispose , která provádí správu prostředků a vyčistit úlohy. Třídy, které implementují Dispose , musí v rámci kontraktu třídy určit, pokud a když příjemci třídy volají metodu pro vyčištění objektu. Systém uvolňování paměti ve výchozím nastavení metodu Dispose nevolá. Implementace Dispose metody však mohou volat metody ve GC třídě pro přizpůsobení chování finalizace systému uvolňování 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
Uvolňování paměti v modulu 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 uvolňování 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 cílit na uvolňování paměti v konkrétní sadě generací, a nikoli vyžadovat uvolňování paměti k vyhodnocení všech generací. Collect Přetížení metody, která obsahuje generation
parametr, umožňuje určit nejstarší generaci, která má být uvolněna z paměti.
Zákaz uvolňování paměti
Uvolňování paměti podporuje režim latence oblasti uvolňování paměti, který lze použít při provádění kritických cest, ve kterých uvolňování paměti může nepříznivě ovlivnit výkon aplikace. Režim latence oblasti uvolňování paměti nevyžaduje, abyste zadali množství paměti, které lze přidělit bez rušení uvolňování 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ě.
Definujete začátek kritické cesty žádné oblasti GC 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é.