Ich habe eine C # -App, die mit der Priorität RealTime läuft. Es war alles in Ordnung, bis ich in den letzten 2 Tagen einige hektische Veränderungen vorgenommen habe. Jetzt hat es in wenigen Stunden keinen Speicher mehr.
Ich versuche herauszufinden, ob es sich um ein Speicherleck handelt, weil ich viel mehr Objekte als vorher konsumiere und GC einfach nicht sammeln kann, weil es mit derselben Priorität läuft.
Meine Frage ist - was könnte GC passieren, wenn es versucht, Objekte in einer Anwendung mit RealTime-Priorität zu sammeln (es gibt auch mindestens einen Thread mit der höchsten Thread-Priorität)?
( P.S. durch Echtzeit-Priorität meine ich Process.GetCurrentProcess (). PriorityClass = ProcessPriorityClass.RealTime )
Es tut uns leid zu erzählen. GC befindet sich im Servermodus
Der GC wird in Ihrem Prozess ausgeführt und hat daher dieselbe Priorität. Die Fähigkeit zum Sammeln wird nicht von PriorityClass
beeinflusst, mit dem Ihre Anwendung ausgeführt wird.
Dieses Speicherleck wird fast sicher dadurch verursacht, dass Sie an der Wurzel eines wachsenden Objektgraphen festhalten, der verhindert, dass der GC diesen sammelt.
Höchstwahrscheinlich kann GC sie nicht sammeln, weil Sie irgendwo noch eine Referenz haben. Versuchen Sie, Ihre Anwendung mit einem Speicherprofiler zu profilieren (RedGate hat einen guten, Sie sollten die Testversion ausprobieren), um herauszufinden, warum GC Ihre Objekte nicht sammelt.
Ich bezweifle wirklich, dass die Priorität in Echtzeit die Ursache Ihres Problems ist. Meine Vermutung ist, dass Sie in den paar Änderungen, die Sie erwähnten, irgendwo Speicher verlieren (was in C # normalerweise bedeutet, Referenzen auf Objekte zu halten, die nicht mehr benötigt werden). Sie können entweder einen Speicherprofiler verwenden, WinDbg mit SOS verwenden (siehe zB Ссылка ) oder einfach nur nehmen ein Blick auf diese Änderungen und versuchen, das Problem zu beleuchten.
Ich würde ernsthaft nicht empfehlen, ein Programm als RealTime-Priorität auszuführen. Grundsätzlich läuft alles, was mit RealTime Priorität hat, mit einer höheren Priorität als die GUI oder sogar der Windows Task-Manager ... und kann somit den Benutzer selbst sperren.
Raymond Chen hat letzte Woche davon gesprochen .
>Insbesondere, da nicht einmal eingegeben läuft in Echtzeit Priorität, können Sie nicht Stoppen Sie es mit irgendwelchen interaktiven Mitteln, weil der Thread, der die Eingabe verwaltet kann nicht einmal laufen, um Ihre Eingabe zu verarbeiten.
Anstatt die Thread-Priorität zu ändern und möglicherweise Ihr System zu sperren, sollten Sie einen Speicherprofiler verwenden, um die tatsächliche Ursache des Problems zu identifizieren. Sie können den Systemmonitor auch verwenden, um die Leistungsindikatoren in der .NET CLR-Speicherkategorie zu überprüfen, um zu sehen, wie viel Speicher zugeordnet ist, wie viel Speicherbereinigung usw. überlebt hat.
Garbage Collection Threads unterscheiden sich je nachdem, auf welchem Systemtyp Sie sie konfiguriert haben. Auf einer einfachen Workstation wird die Garbage Collection von jedem einzelnen Thread gehostet, aber nur einer kann gleichzeitig hosten. Wenn es für die Ausführung auf einem Server konfiguriert ist, wird ein separater Thread die Garbage Collection hosten.
Aber vielleicht bleiben Ihre Objekte zu lange herum und kommen zur Long-Life-Generation, und die Müllsammlung betrachtet sie nicht so oft, wie Sie möchten.
Oder vielleicht haben Sie ein anderes Problem.
Tags und Links .net multithreading garbage-collection