Wie kann ungenutzter Speicher aus der großen Objektspeicher-LOH aus mehreren verwalteten Apps abgerufen werden?

8

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%     
Gishu 24.06.2009, 09:33
quelle

3 Antworten

5

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.

  • Objekt mit Größe & gt; 85000 Bytes sind auf LOH zugewiesen, beachten Sie, dass es 85000 Bytes nicht 85K ist, es können auch Implementierungsdetails geändert werden. Nun zurück zu deiner Frage. Der GC löscht die LOH-Segmente, die in 2 Situationen nicht verwendet werden 1- Wenn der Speicherdruck an der Maschine hoch ist (~ 95-98%) 2- Wenn neue Zuordnungsanforderungen nicht erfüllt werden, werden die nicht verwendeten Seiten in der LOH
  • freigegeben

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

    
mfawzymkh 24.06.2009 23:34
quelle
3

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 ...

    
Marc Gravell 24.06.2009 09:39
quelle
2

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>     

1800 INFORMATION 24.06.2009 09:39
quelle

Tags und Links