2011-01-16 3 views
5

Mein kleiner Stresstest, der Arrays mit zufälliger Länge (jeweils 100..200MB) in einer Schleife zuordnet, zeigt ein unterschiedliches Verhalten auf einer 64-Bit-Win7-Maschine und auf einer 32-Bit-XP (in einer VM). Beide Systeme weisen normalerweise so viele Arrays zu, wie in das LOH passen. Dann wird die LOH immer größer, bis der verfügbare virtuelle Adressraum voll ist. Erwartetes Verhalten bisher. Aber als - auf weitere Anfragen - beide verhalten sich anders:Wann und wie wird der .NET-gemanagte Heap ausgetauscht?

Während auf Win7 eine OutOfMemoryException (OOM) geworfen wird, auf XP scheint es, wird der Haufen erhöht und sogar auf die Festplatte ausgetauscht - zumindest keine OOM geworfen wird. (Ich weiß nicht, ob das mit XP in einer virtuellen Box zu tun haben könnte.)

Frage: Wie entscheidet die Laufzeit (oder das Betriebssystem?), Ob für verwaltete Speicherzuweisung Anforderungen, wenn es zu groß ist Um eine Zuordnung zu erhalten, wird eine OOM generiert oder der Heap mit großen Objekten wird erhöht - eventuell sogar auf die Festplatte ausgelagert? Wenn es getauscht wird, wann kommt ein OOM vor?

IMO diese Frage ist wichtig für alle Produktionsumgebungen, möglicherweise mit größeren Datensätzen. Irgendwie fühlt es sich "sicherer" an zu wissen, das System würde in solchen Situationen (durch Tausch) eher dramatisch verlangsamen als einfach ein OOM zu werfen. Zumindest sollte es irgendwie deterministisch sein, oder?

@Edit: Die App ist eine 32-Bit-Anwendung, also in 32-Bit-Modus auf Win 7 ausgeführt

+0

"bis zum physikalischen Adressraum" meinen Sie nicht den virtuellen Adressraum dieses Prozesses? – CodesInChaos

+0

Und ist Ihr Programm auf AnyCPU oder 32BitOnly? Nicht genügend Speicher in einem 64-Bit-Programm sollte nicht einfach passieren. Ich würde erwarten, dass der Computer wegen exzessivem Swapping lange vorher zum Stillstand kommt. – CodesInChaos

+0

Sie haben Recht: "virtueller Adressraum" war gemeint. Und ja, das Prog kompiliert zu einer 32-Bit-Anwendung, die WOW auf Win7 ausführt. – user492238

Antwort

8

Die normalen Regeln gelten, um ein verwalteten Prozess nicht anders von den Windows-Speichermanagern behandelt wird. Die ultimative Quelle für Speicherbereiche ist der Windows-Speichermanager. Wenn es kein Loch im Adressraum des virtuellen Speichers finden kann, um die angeforderte Speicherzuweisung zu erfüllen, schlägt der VirtualAlloc() - Aufruf fehl und die CLR generiert OOM.

Dasselbe gilt für das Auslagerungsverhalten. Wenn Seiten im RAM benötigt werden, um Seiten anderer Prozesse oder sogar Seiten desselben Prozesses zuzuordnen, werden sie ausgelagert. Dies ist sonst nicht mit OOM verbunden.

Sie können nicht davon ausgehen, dass es auf XP genauso funktioniert wie auf Win7 x64. Wenn Sie OOM auf x64 erstellen, wenn Sie Ihr Programm auf AnyCPU erstellen, ist das ziemlich ungewöhnlich. Ein 64-Bit-Betriebssystem verfügt über einen sehr großen virtuellen Speicheradressraum. Die Obergrenze wird durch die maximale Größe der Auslagerungsdatei festgelegt. Ein 32-Bit-Programm wird in der WOW-Emulationsschicht ausgeführt, es kann einen Adressraum von 4 GB haben, wenn Sie das Optionsbit LARGEADDRESSAWARE mit Editbin.exe festlegen.

Sie können das VMMap-Dienstprogramm von SysInteral verwenden, um zu sehen, wie der Adressraum Ihres Prozesses aufgeteilt wird.

+1

"Wenn es kein Loch im Adressraum des virtuellen Speichers finden kann, um die angeforderte Speicherzuweisung zu erfüllen, schlägt der Aufruf HeapAlloc() fehl und die CLR generiert OOM." - Aber warum ist der Hack nicht Paging als? Zumindest sollte es, wenn der virtuelle Speicherplatz noch nicht voll belegt ist, aber kein anderer RAM gefunden werden konnte? – user492238

+1

Zwei * sehr * verschiedene Dinge. Paging tritt auf, wenn * physischer * Speicherplatz gefunden werden muss. RAM. Speicherzuordnungen erfolgen im * virtuellen * Speicher. Ein 32-Bit-Prozess hat 2 Gigabyte davon, egal wie viel RAM installiert ist. Die Summe aller virtuellen Speicher, die von allen Prozessen zugewiesen werden, ist nur durch die Auslagerungsdatei und nicht durch den Arbeitsspeicher begrenzt. –

+1

Also sind die 2GB (einige TB auf 64bit) nur theoretische Grenzen?Memory Manager tauscht aus, bis die Größe des für den Prozess reservierten Auslagerungsdatei * part * voll ist? Und wenn dieser Teil sogar in RAM passt, tauscht er überhaupt nicht? Dies würde die Frage beantworten – user492238

Verwandte Themen