Latenzmodi
Zum Freigeben von Objekten muss der Garbage Collector (GC) alle ausgeführten Threads einer Anwendung beenden. Der Zeitraum, in dem der Garbage Collector aktiv ist, wird als dessen Latenz bezeichnet.
In einigen Situationen, z. B. wenn eine Anwendung Daten abruft oder Inhalte anzeigt, kann eine vollständige Garbage Collection zu einem kritischen Zeitpunkt erfolgen und die Leistung beeinträchtigen. Sie können das Ausmaß der Garbage Collection anpassen, indem Sie die GCSettings.LatencyMode-Eigenschaft auf einen der System.Runtime.GCLatencyMode-Werte festlegen.
Einstellungen mit geringer Latenz
Die Verwendung einer Einstellung mit "geringer" Latenz bedeutet, dass der Garbage Collector weniger in Ihre Anwendung eindringt. Die Garbage Collection ist bei der Freigabe von Arbeitsspeicher eher konservativ.
Die System.Runtime.GCLatencyMode-Enumeration bietet zwei Einstellungen mit geringer Latenz:
GCLatencyMode.LowLatency unterdrückt Garbage Collections der 2. Generation und führt nur Garbage Collctions der Generationen 0 und 1 durch. Diese Einstellung kann nur für kurze Zeiträume verwendet werden. Über längere Zeiträume (und wenn auf dem System nicht genügend Arbeitsspeicher vorhanden ist) löst der Garbage Collector eine Auflistung aus, die die Anwendung kurz anhalten und einen zeitkritischen Vorgang unterbrechen kann. Diese Einstellung ist nur für die Garbage Collection auf Arbeitsstationen verfügbar.
GCLatencyMode.SustainedLowLatency unterdrückt Garbage Collections der 2. Generation im Vordergrund und führt nur Garbage Collections der Generationen 0 und 1 sowie Collections der Generation 2 im Hintergrund aus. Diese Einstellung kann für längere Zeiträume verwendet werden und ist für die Garbage Collection für die Arbeitsstation und für die Garbage Collection auf dem Server verfügbar. Diese Einstellung kann nicht verwendet werden, wenn die Garbage Collection im Hintergrund deaktiviert ist.
In Zeiten mit geringer Latenz werden Garbage Collections der Generation 2 unterdrückt, außer wenn Folgendes geschieht:
Das System erhält vom Betriebssystem eine Benachrichtigung über unzureichenden Arbeitsspeicher.
Der Anwendungscode initiiert eine Garbage Collection, indem die GC.Collect-Methode aufgerufen und für den
generation
-Parameter der Wert "2" angegeben wird.
Szenarien
In der folgenden Tabelle werden die Anwendungsszenarien für die Verwendung der GCLatencyMode-Werte aufgeführt:
Latenzmodus | Anwendungsszenarien |
---|---|
Batch | Für Anwendungen ohne Benutzeroberfläche (UI) oder serverseitige Vorgänge. Wenn Garbage Collection im Hintergrund deaktiviert ist, ist dies der Standardmodus für die Garbage Collection auf Arbeitsstationen und Servern. Der Batch-Modus setzt außerdem die gcConcurrent-Einstellung außer Kraft, d.h., er verhindert parallele oder im Hintergrund ausgeführte Garbage Collection. |
Interactive | Für die meisten Anwendungen, die über eine Benutzeroberfläche verfügen. Dies ist der Standardmodus für die Garbage Collection auf Arbeitsstationen und Servern. Wenn jedoch eine App gehostet ist, haben die Einstellungen des Hostprozesses für die Garbage Collection Vorrang. |
LowLatency | Für Anwendungen mit kurzen, zeitkritischen Vorgängen, bei denen Unterbrechungen durch den Garbage Collector störend sein könnten. Hierzu gehören beispielsweise Anwendungen, die Animationsrendering oder Datenerfassungsfunktionen ausführen. |
SustainedLowLatency | Für Anwendungen mit zeitkritischen Vorgängen über einen möglicherweise längeren Zeitraum, bei denen Unterbrechungen durch den Garbage Collector störend sein könnten. Hierzu gehören beispielsweise Anwendungen, die schnelle Antwortzeiten bei Marktdatenänderungen während der Geschäftszeit erfordern. Dieser Modus führt im Vergleich zu anderen Modi zu einem größeren verwalteten Heap. Da der verwaltete Heap nicht komprimiert wird, ist eine stärkere Fragmentierung möglich. Stellen Sie sicher, dass genügend Arbeitsspeicher verfügbar ist. |
Richtlinien für die Verwendung von geringer Latenz
Beachten Sie beim Verwenden des GCLatencyMode.LowLatency-Modus die folgenden Richtlinien:
Halten Sie die Zeiten mit geringer Latenz möglichst kurz.
Vermeiden Sie es, in Zeiten mit geringer Latenz große Speichermengen zu belegen. Benachrichtigungen über unzureichenden Arbeitsspeicher können ausgegeben werden, wenn die Garbage Collection weniger Objekte freigibt.
Minimieren Sie im Modus für geringe Latenz die Anzahl neuer Zuordnungen, insbesondere Zuordnungen für den großen Objektheap und fixierte Objekte.
Achten Sie auf potenziell zuordnende Threads. Weil die Einstellung der LatencyMode-Eigenschaft prozessweit gültig ist, können in jedem zuordnenden Thread OutOfMemoryException-Ausnahmen generiert werden.
Umschließen (wrappen) Sie den Code für geringe Latenz in eingeschränkten Ausführungsbereichen. Weitere Informationen finden Sie unter Eingeschränkte Ausführungsbereiche.
Sie können Garbage Collections der Generation 2 in Zeiten mit geringer Latenz erzwingen, indem Sie die GC.Collect(Int32, GCCollectionMode)-Methode aufrufen.