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