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
"bis zum physikalischen Adressraum" meinen Sie nicht den virtuellen Adressraum dieses Prozesses? – CodesInChaos
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
Sie haben Recht: "virtueller Adressraum" war gemeint. Und ja, das Prog kompiliert zu einer 32-Bit-Anwendung, die WOW auf Win7 ausführt. – user492238