Sdílet prostřednictvím


Režimy latence

Aby bylo možné znovu získat objekty, musí garbage collector (GC) zastavit všechna 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ém okamžiku a zhoršit výkon. Můžete upravit intruzivnost sběrače paměti nastavením vlastnosti GCSettings.LatencyMode na jednu z hodnot System.Runtime.GCLatencyMode.

Nastavení nízké latence

Použití nastavení nízké latence znamená, že garbage collector méně zasahuje do vaší aplikace. Uvolňování paměti je konzervativnější při získávání zpět paměti.

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

  • GCLatencyMode.LowLatency potlačuje 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. Během delších časových období, pokud je systém pod tlakem paměti, spustí garbage collector sběr, což 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čuje kolekce 2. generace na pozadí a provádí pouze kolekce 0, 1 a kolekce 2. generace na pozadí. Lze ho použít 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ázáno sbírání nevyužitých objektů na pozadí.

Během období nízké latence jsou kolekce generace 2 potlačeny, 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 indukuje 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 aplikací pro použití GCLatencyMode hodnot:

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

Pokud je uvolňování paměti na pozadí zakázáno, jedná se o výchozí režim uvolňování paměti pro pracovní stanice a servery. 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í s uživatelským rozhraním.

Toto je výchozí režim pro pracovní stanici a uvolňování paměti serveru. Pokud je ale aplikace hostovaná, mají přednost nastavení uvolňování paměti hostitelského procesu.
LowLatency Pro aplikace, které mají krátkodobé operace citlivé na čas, během nichž může být přerušení kolektoru 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 během specifické, ale potenciálně delší časové periody, kdy přerušení kvůli uvolňování paměti může být rušivé. Například aplikace, které potřebují rychlou dobu odezvy při změnách dat trhu během obchodní doby.

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

Pokyny pro používání nízké latence

Pokud používáte režim GCLatencyMode.LowLatency , zvažte následující pokyny:

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

  • Vyhněte se přidělování velkých objemů paměti během období s nízkou latencí. Oznámení o nedostatku paměti může nastat, protože garbage collection uvolní méně objektů.

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

  • Dejte pozor na vlákna, která by mohla přidělovat. Vzhledem k tomu, že nastavení vlastnosti LatencyMode platí pro celý proces, mohou být OutOfMemoryException výjimky generovány v jakémkoli vlákně, které provádí přidělování.

  • Zabalte kód s nízkou latencí do oblastí omezeného spouštění. Další informace najdete v tématu Oblasti omezeného spouštění.

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

Viz také