Während ich mit einem Kollegen über eine bestimmte Gruppe von Apps sprach, die beim Start fast 1,5 G Speicher verwendeten, wies er mich auf einen sehr guten Link auf . NET-Produktionsdebugging
Der Teil, der mich verwirrt hat, ist ...
Zum Beispiel, wenn Sie 1 MB zuweisen Speicher zu einem einzigen Block, der große Object Heap wird auf 1 MB vergrößert. Wenn Sie dieses Objekt freigeben, wird der große Objekt-Heap löscht nicht die virtueller Speicher, so bleibt der Haufen bei 1 MB in Größe. Wenn Sie einen anderen zuweisen 500-KB-Block später ist der neue Block innerhalb des 1 MB großen Blocks von Speicher, der zu dem großen Objekt gehört Haufen. Während der Prozesslebensdauer, der großer Objekt-Heap wächst immer zum Halten alle großen Blockzuweisungen derzeit referenziert, aber nie schrumpft, wenn Objekte freigegeben werden, auch wenn eine Speicherbereinigung stattfindet. Abbildung 2.4 auf der nächsten Seite zeigt ein Beispiel für einen großen Objekt-Heap.
Nehmen wir an, wir haben eine fiktive App, die eine Menge großer Objekte erzeugt (& gt; 85 KB), so dass der große Objekt-Heap beispielsweise auf 200 Meg wächst. Jetzt sagen wir, dass wir 10 solcher App-Instanzen laufen haben ... so dass 2000 Megs zugewiesen wurden. Jetzt wird diese Erinnerung nie an das OS zurückgegeben, bis der Prozess beendet ist ... (ist, was ich verstanden habe)
Gibt es Lücken in meinem Verständnis? Wie bekommen wir in den verschiedenen LOHeaps ungenutzte Speicher zurück? schaffen wir nicht den perfekten Sturm von OutOfMemoryExceptions?
Update: Aus der Antwort von Marc wollte ich klarstellen, dass die LOH-Objekte nicht referenziert sind - die großen Objekte sind use-n-throw - aber der Heap schrumpft nicht, obwohl der Heap ist relativ leer nach dem anfänglichen Anstieg.
Update # 2: Nur ein Code-Snippet (übertrieben, aber den Punkt quer über ich denke) .. Ich sehe eine OutOfMemoryException um die Zeit der virtuelle Speicher erreicht die 1,5G-Marke auf meinem Rechner ( 1.7G auf einem anderen) .. Von Blogeintrag von Eric L. ," Prozessgedächtnis kann als eine riesige Datei auf Festplatte visualisiert werden .. "- dieses Ergebnis ist daher unerwartet. Die Computer hatten in diesem Fall GB freien Speicherplatz auf der Festplatte. Gibt es in der PageFile.sys-BS-Datei (oder verwandten Einstellungen) Einschränkungen?
%Vor%Es gibt eine Klarstellung, die ich zuerst machen möchte. - Angenommen, Sie verwenden App als 32-Bit-App, ist der verfügbare VA-Speicherplatz für Ihren Prozess nur 2 GB, 3 GB, wenn Sie große Adressraum-Schalter aktiviert haben, selbst wenn Sie SEITE haben, ist es egal, ob Sie 32bit sind Prozess, es ist wichtig, wenn Sie 64bit ausführen, wo Sie riesigen Adressraum haben.
damit Sie in einem dieser Fälle den Speicher zurückbekommen. Die Tatsache, dass Sie ein OOM treffen, bevor Sie die 2-GB-Grenze erreichen, kann eine VA-Fragmentierung zur Folge haben. Eine VA-Fragmentierung tritt auf, wenn Sie keinen kontinuierlichen VA-Adressraum haben, um eine neue Zuordnung zu erfüllen. t haben 2 aufeinanderfolgende Seiten in Ihrer VA (unter der Annahme, dass die Seitengröße 4 K beträgt)
Sie können die! vamap Debugger-Erweiterung in Debugging-Tools für Windows verwenden, um dies zu überprüfen.
Hoffe, das hilft Danke
Wenn die LOH den Speicher behalten will, dann liegt das an der LOH - aber vergessen Sie nicht, dass OutOfMemoryException
pro Prozess ist, da wirklich die Festplatte der begrenzende Faktor für den virtuellen Speicher ist. Eric Lippert bloggte über das vor kurzem. Natürlich verhindert das nicht, dass es durch das ganze Paging schlecht läuft ...
Nun, wenn Sie wirklich über diese Art von Zuweisungsmustern verfügen, können Sie Ihre großen Objekte in eine andere Anwendungsdomäne verschieben. Wenn Sie sich entscheiden, alle großen Objekte freizugeben, veröffentlichen Sie die Anwendungsdomäne, und der Heap für diese Anwendungsdomäne wird freigegeben / p>
Tags und Links .net c# garbage-collection