Režimy latence

Pokud chcete uvolnit objekty, musí uvolňování paměti (GC) zastavit všechny spuštěné vlákna v aplikaci. Doba, během které je uvolňování paměti aktivní, se označuje jako její latence.

V některých situacích, například když aplikace načte data nebo zobrazuje obsah, může dojít k úplnému uvolňování paměti v kritické době a bránit výkonu. Dotěrnost uvolňování paměti můžete upravit nastavením GCSettings.LatencyMode vlastnosti na jednu z System.Runtime.GCLatencyMode hodnot.

Nastavení nízké latence

Když použijete nastavení nízké latence, znamená to, že systém uvolňování paměti ve vaší aplikaci vytěsní méně. Uvolňování paměti je konzervativnější ohledně uvolnění paměti.

Výčet System.Runtime.GCLatencyMode poskytuje dvě nastavení nízké latence:

  • GCLatencyMode.LowLatency potlačí kolekce generace 2 a provádí pouze kolekce 0 a 1. generace. Lze ho použít pouze v krátkých časových obdobích. V delších obdobích, pokud je systém pod tlakem paměti, uvolňování paměti aktivuje kolekci, která může krátce pozastavit aplikaci a narušit časově kritickou operaci. Toto nastavení je k dispozici pouze pro uvolňování paměti pracovní stanice.

  • GCLatencyMode.SustainedLowLatency potlačí kolekce generace 2 na popředí a provádí pouze kolekce 0, 1 a generace 2. Může se používat po delší dobu a je k dispozici pro uvolňování paměti pracovní stanice i serveru. Toto nastavení nelze použít, pokud je zakázané uvolňování paměti na pozadí.

Během období s nízkou latencí se kolekce generace 2 potlačí, pokud nedojde k následujícímu:

  • Systém obdrží oznámení o nedostatku paměti z operačního systému.

  • Kód aplikace vyvolá kolekci voláním GC.Collect metody a zadáním 2 pro generation parametr.

Scénáře

Následující tabulka uvádí scénáře aplikace pro použití GCLatencyMode hodnot:

Režim latence Scénáře aplikací
Batch Pro aplikace, které nemají uživatelské rozhraní nebo operace na straně serveru.

Pokud je uvolňování paměti na pozadí zakázané, jedná se o výchozí režim pro uvolňování paměti pracovní stanice a serveru. Batch režim také přepíše nastavení gcConcurrent , to znamená, že zabraňuje pozadí nebo souběžné kolekce.
Interactive Pro většinu aplikací, které mají uživatelské rozhraní.

Toto je výchozí režim pro uvolňování paměti pracovní stanice a serveru. Pokud je ale aplikace hostovaná, má přednost nastavení uvolňování paměti hostitelského procesu.
LowLatency U aplikací, které mají krátkodobé operace citlivé na čas, během kterých může být přerušení uvolňování paměti rušivé. Například aplikace, které vykreslují animace nebo funkce získávání dat.
SustainedLowLatency U aplikací, které mají operace citlivé na čas pro obsažené, ale potenciálně delší dobu trvání, během kterých může přerušení uvolňování paměti narušit. Například aplikace, které potřebují rychlou dobu odezvy při změnách dat trhu během obchodních hodin.

Výsledkem tohoto režimu je větší spravovaná velikost haldy než jiné režimy. Vzhledem k tomu, že nekompprimuje spravovanou haldu, je možné vyšší fragmentaci. Ujistěte se, že je k dispozici dostatek paměti.

Pokyny pro použití nízké latence

Při použití režimu GCLatencyMode.LowLatency zvažte následující pokyny:

  • Udržujte co nejkratší dobu v nízké latenci.

  • Vyhněte se přidělování velkých objemů paměti během období nízké latence. K oznámením s nedostatkem paměti může dojít, protože uvolňování paměti uvolní méně objektů.

  • V režimu nízké latence minimalizujte počet nových přidělení, zejména přidělení do velké haldy objektů a připnutých objektů.

  • Mějte na paměti vlákna, která by mohla být přidělováním. Vzhledem k tomu, že LatencyMode nastavení vlastnosti je celoprocesové, OutOfMemoryException lze výjimky vygenerovat v libovolném vlákně, které je přidělováním.

  • Zabalte kód s nízkou latencí do oblastí omezeného spouštění. Další informace naleznete v tématu Omezené oblasti provádění.

  • Kolekce generace 2 můžete vynutit během období nízké latence voláním GC.Collect(Int32, GCCollectionMode) metody.

Viz také