Когда и как происходит замена управляемой кучи .NET?

Мой небольшой стресс-тест, который выделяет массивы произвольной длины (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.

5
задан user492238 16 January 2011 в 18:34
поделиться