Režimy latence
Chcete-li uvolnit objekty, musí uvolňování paměti (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é době a bránit výkonu. Můžete upravit rušivost uvolňování paměti 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č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. V delších obdobích, pokud je systém pod zatížením paměti, spustí uvolňování paměti kolekci, která může krátce pozastavit aplikaci a narušit dobu kritickou operaci. Toto nastavení je k dispozici pouze pro uvolňování paměti pracovní stanice.
GCLatencyMode.SustainedLowLatency potlačuje kolekce 2. generace a provádí pouze kolekce 0, 1 a generace 2. 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ázané uvolňování paměti 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ázané, jedná se o výchozí režim pro pracovní stanici a uvolňování paměti 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í 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 | U aplikací s krátkodobými operacemi citlivými na čas, během kterých může být přerušení systému 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ženou, ale potenciálně delší dobu, během které 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í doby. 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žívání nízké latence
Pokud používáte režim GCLatencyMode.LowLatency , zvažte následující pokyny:
Udržujte co nejkratší dobu v době nízké latence.
Vyhněte se přidělování velkých objemů paměti během období s nízkou latencí. K oznámením o nedostatku 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í na velkou haldu objektu a připnuté objekty.
Mějte na paměti vlákna, která by mohla být přidělování. Vzhledem k tomu, že LatencyMode nastavení vlastnosti je v rámci procesu, OutOfMemoryException lze výjimky vygenerovat v jakémkoli vlákně, které je 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.