Mój mały test warunków skrajnych, który przydziela losowe tablice długości (100..200 MB każdy) w pętli, pokazuje inne zachowanie na 64-bitowej maszynie Win7 i 32-bitowym XP (w VM). Oba systemy najpierw zwykle przydzielają tyle tablic, ile zmieści się w LOH. Następnie LOH staje się coraz większy, dopóki wirtualna przestrzeń adresowa nie zostanie wypełniona. Oczekiwane zachowanie do tej pory. Ale dalej - na dalsze prośby - oba zachowują się inaczej:Kiedy i jak jest przenoszona sterta .NET?
Podczas gdy na Win7 wyrzucany jest OutOfMemoryException (OOM), na XP wydaje się, że stertę zwiększa się, a nawet zamienia na dysk - przynajmniej OOM nie jest rzucany. (Nie wiem, czy to może mieć związek z XP działającym w wirtualnym pudełku).
Pytanie: Jak decyduje środowisko wykonawcze (lub system operacyjny?), Czy dla zarządzanych żądań przydzielania pamięci, czy jest zbyt duże aby uzyskać alokację, generowany jest OOM lub zwiększa się duża stertę obiektu - ewentualnie nawet zamieniona na dysk? Jeśli jest zamieniony, kiedy występuje OOM niż?
IMO to pytanie jest ważne dla wszystkich środowisk produkcyjnych, potencjalnie zajmujących się większymi zbiorami danych. Jakoś czuć się "bezpieczniej", aby wiedzieć, system raczej spowolniłby dramatycznie w takich sytuacjach (poprzez zamianę) niż po prostu wyrzucenie OOM. Przynajmniej powinno to być w jakiś sposób deterministyczne, prawda?
@Edit: aplikacja jest aplikacją 32-bitową, dlatego działa w trybie 32-bitowym na Win 7.
"aż do fizycznej przestrzeni adresowej" nie masz na myśli wirtualnej przestrzeni adresowej tego procesu? – CodesInChaos
Czy Twój program jest ustawiony na AnyCPU lub na 32BitOnly? Z pamięci w 64-bitowym programie nie powinno się łatwo. Spodziewałbym się, że komputer przestanie działać z powodu nadmiernej wymiany na długo przed tym. – CodesInChaos
Masz rację: chodziło o "wirtualną przestrzeń adresową". I tak, prog kompiluje się do aplikacji 32-bitowej, uruchamiając WOW na Win7. – user492238