Мой небольшой стресс-тест, который выделяет массивы произвольной длины (каждый по 100..200 МБ) в цикле, показывает различное поведение на 64-битной машине с Win7 и на 32-битной XP (в виртуальной машине). Обе системы сначала обычно выделяют столько массивов, сколько поместится в LOH. Затем LOH становится все больше и больше, пока доступное виртуальное адресное пространство не будет заполнено. Пока ожидаемое поведение. Но затем — при дальнейших запросах — оба ведут себя по-разному:
В то время как в Win7 выбрасывается OutOfMemoryException (OOM), в XP кажется, что куча увеличивается и даже перемещается на диск - по крайней мере, OOM не выбрасывается. (Не знаю, может ли это быть связано с тем, что XP работает в виртуальной машине.)
Вопрос: Как среда выполнения (или ОС?) принимает решение, будь то для управляемых запросов на выделение памяти, если она слишком велика для выделения, генерируется OOM или куча больших объектов увеличивается - в конечном итоге даже перемещается на диск? Если он поменялся местами, когда происходит OOM?
ИМО, этот вопрос важен для всех производственных сред, потенциально связанных с большими наборами данных. Почему-то кажется более «безопасным» знать, что в таких ситуациях система скорее резко замедлится (путем замены), чем просто выдаст OOM. По крайней мере, это должно быть как-то детерминировано, верно?
@Edit: приложение является 32-битным приложением, поэтому работает в 32-битном режиме на Win 7.