.net-Speicher wird nicht zurückgewonnen

9

Ich habe einen 'Dienst' (owin / webapi + odp.net verwaltet), der mit dem 'server gc mode' auf dem x64-Rechner läuft. Nach dem Ausführen der Testsuite lag die Speicherbelegung bei etwa 2 GB. Ich habe den Speicherdruck auf dieser Maschine erzeugt (ein anderes Programm, das den gesamten verfügbaren Speicher und mehr verbraucht hat). Ich habe erwartet, dass windows .net zwingen wird, etwas Speicher freizugeben. Wie auch immer, nicht. Hier ist eine Ausgabe von windbg:

%Vor%

Also gibt es nur ungefähr 48MB wirklich benutzt und 1.8Gb frei, der meiste Speicher ist nicht in LOH, aber in Gen 0 Heap, aber .net würde diesen Speicher nicht zurückgeben. Und inzwischen hungerte das System nach Gedächtnis. Zum Beispiel konnte IIS nicht gestartet werden, weil nicht genügend Speicher vorhanden war.

Warum Speicher wurde nicht von Windows zurückgefordert?

    
koruyucu 10.08.2015, 12:44
quelle

2 Antworten

2

Nun Fenster können ".Net" nicht zwingen, Speicher freizugeben. Obwohl ich kein Experte in der .Net-Laufzeit bin, ist meine Erfahrung, dass das .net-Framework Speicher halten wird, sobald Ihre Anwendung beginnt, viel davon zu verbrauchen. Es wird langsam zurückgeben, wie es passt. Aus Windows-Perspektive weiß es nicht, was .Net damit machen wird, aber es .Net hat behauptet, dass Speicher vom Betriebssystem und so, bis es (.net) es zurückgibt, Fenster diesen Speicher nicht einer anderen Anwendung geben kann. Es gibt mehrere 400 + mb Chunks von System.Byte [], die festgehalten werden, was auf ein Speicherleck hinweisen könnte. Aus der Sicht des Betriebssystems hat das Framework den Speicher angefordert und diesen Speicher sogar verwendet, bis es explizit (aus dem Framework, nicht Sie) zurück gegeben wird, Fenster können nichts dagegen tun. Ich würde Ihre Anwendung sehr sorgfältig profilieren, weil im Allgemeinen der Grund, warum .Net Speicher nicht freigibt, weil Sie ein Speicherleck haben. Die Verwendung der Speicheranalyse-Tools in Visual Studio sollte Ihnen zeigen, ob Sie den Speicher "fixiert" lassen oder einfach nur daran festhalten. Wirklich schlechte Schuldige sind oft statische Klassenvariablen / Ereignisse.

SO-Link: . NET Freie Speicherbelegung (Verhindern von Überlagerung / Freigeben von Speicher an das Betriebssystem)

    
Nathan 01.09.2015 03:40
quelle
0

Da Windows die App nicht dazu zwingen kann, Objekte freizugeben. Sie müssen eine Möglichkeit finden, die maximale Speichernutzung für die Anwendung zu definieren. Wenn das maximale Limit erreicht ist, rufen Sie den Garbage Collector manuell über GC.Collect () auf.

Während die Anwendung ausgeführt wird, versuchen Sie, den Prozess & amp; setze das maxLimit, ähnlich wie this

    
Nikita Shrivastava 01.09.2015 06:37
quelle

Tags und Links