Ich betreibe eine große .net 4.0 x86 App auf Windows Server 2003 x64 (2x Xeon 4-Core-Procs) und stoße auf Probleme, wo meine App ~ 2-3 mal pro Tag für 30 Sekunden einfriert und dann wieder funktioniert wie normal. Die Anwendung wird nur einmal pro Woche neu gestartet und verbraucht 400-800 MB Arbeitsspeicher. Daher gehe ich davon aus, dass es sich bei diesen Speicherungen um Garbage Collection handelt. Ich sehe nur das Einfrieren in den Protokollen, nicht live, oder ich würde den Task-Manager überprüfen, um zu bestätigen.
Ich versuche herauszufinden, welcher .Net 4 GC läuft, und wie man entweder den GC auf den neuen gleichzeitigen Hintergrund gc umstellt, wenn dies nicht der Fall ist, oder wie man bestätigt, dass dies GCs sind (Procmon nicht Zeige .Net Instrumente in Win2k3 Server).
Sie arbeiten mit der Serverversion von Windows, Sie erhalten standardmäßig die Serverversion des Garbage Collectors. Das macht keine Hintergrundsammlungen, Müll wird von mehreren Threads gesammelt, so dass gelegentliche beobachtbare Pausen nicht ungewöhnlich sind. Sie können die Arbeitsstationsversion mit einer app.exe.config-Datei erzwingen:
%Vor%Überprüfen Sie auch die Dokumentation für die Methode GC.RegisterForFullGCNotification () für eine Möglichkeit, mit den Nebeneffekten der Pausen umzugehen.
.NET Version 4.5 unterstützt Hintergrundsammlungen für den Server GC.
Ich habe diese Antwort erneut in meinem Blog gepostet: Ссылка
Sie können anhand zweier Methoden feststellen, welche Version von GC Sie verwenden:
Sie haben nicht gesagt, welche Art von App Sie haben. Wenn Sie eine Konsolenanwendung, WinForm-App oder einen Windows-Dienst ausführen, erhalten Sie den Workstation-GC. Nur weil Sie auf einem Server-Betriebssystem laufen, heißt das nicht, dass Sie die Server-Version von GC erhalten. Wenn Ihre App nicht auf einem Computer mit mehreren Prozessoren gehostet wird, erhalten Sie standardmäßig den Eintrag Workstation GC - Concurrent. Wenn Ihre App auf einem Computer mit mehreren Prozessoren gehostet wird, erhalten Sie standardmäßig den ServerGC.
Jede selbst gehostete IIS- oder CLR-App wird standardmäßig im ServerGC-Modus ausgeführt.
Folgendes gilt für jeden .NET Managed Process:
Es gibt nur einen Finalizer-Thread pro verwaltetem Prozess, unabhängig vom GC-Modus. Selbst während einer gleichzeitigen GC werden verwaltete Threads zweimal ausgesetzt (blockiert), um einige Phasen des GC auszuführen.
Eine selten bekannte Tatsache ist , dass Sie selbst dann, wenn Sie versuchen, den Server-Modus von GC festzulegen, nicht in Server-GC ausgeführt werden. Der GC bestimmt schließlich, welcher Modus für Ihre App optimal ist und überschreibt Ihre Einstellungen, wenn festgestellt wird, dass sich Ihre ServerGC-Einstellung negativ auf Ihre Anwendung auswirkt. Bei jeder gehosteten CLR-App werden alle manuellen GC-Einstellungen außer Kraft gesetzt.
Somit haben alle Anwendungen in .NET 4.5+ jetzt Hintergrund-GC verfügbar , unabhängig davon, welchen GC sie verwenden.
.NET Framework 4.7.1 enthält Änderungen in Garbage Collection (GC), um die Zuordnungsleistung zu verbessern, insbesondere für Large Object Heap (LOH) -Zuordnungen. Dies ist auf eine Änderung der Architektur zurückzuführen, bei der die Zuweisungssperre des Heaps für Small Object Heap (SOH) und LOH in zwei aufgeteilt wird. Anwendungen, die viele LOH-Zuordnungen vornehmen, sollten eine Verringerung der Zuordnungskonfliktkonflikte sehen und eine bessere Leistung sehen. Diese Verbesserungen ermöglichen LOH-Zuordnungen, während Hintergrund-GC (BGC) SOH überstreicht. Normalerweise wartet der LOH-Zuordner die gesamte Dauer des BGC-Sweep-Prozesses, bevor er Anforderungen zur Speicherzuweisung erfüllen kann. Dies kann die Leistung beeinträchtigen. Sie können dieses Problem in GCStats von PerfView beobachten, wo eine 'LOH-Zuordnungspause (aufgrund des Hintergrund-GC)' vorliegt & gt; 200 ms Eventtabelle. Der Grund für die Pause ist "Warten auf BGC, um freie Listen zu erstellen". Diese Funktion sollte dazu beitragen, dieses Problem zu beheben.
Tags und Links .net garbage-collection