Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: user492238Ответов: 1

Мой небольшой стресс-тест, который выделяет массивы произвольной длины (каждый по 100..200 МБ) в цикле, показывает различное поведение на 64-битной машине с Win7 и на 32-битной XP (в виртуальной машине). Обе системы сначала обычно выделяют столько массивов, сколько поместится в LOH. Затем LOH становится все больше и больше, пока доступное виртуальное адресное пространство не будет заполнено. Пока ожидаемое поведение. Но затем - при дальнейших запросах - оба ведут себя по-разному:

В то время как в Win7 выбрасывается OutOfMemoryException (OOM), в XP кажется, что куча увеличивается и даже перемещается на диск - по крайней мере, OOM не выбрасывается. (Не знаю, может ли это быть связано с тем, что XP работает в виртуальной машине.)

Вопрос: Как среда выполнения (или ОС?) принимает решение, будь то для управляемых запросов на выделение памяти, если она слишком велика для выделения, генерируется OOM или куча больших объектов увеличивается - в конечном итоге даже перемещается на диск? Если он поменялся местами, когда происходит OOM?

ИМО, этот вопрос важен для всех производственных сред, потенциально связанных с большими наборами данных. Почему-то кажется более "безопасным" знать, что в таких ситуациях система скорее резко замедлится (путем замены), чем просто выдаст OOM. По крайней мере, это должно быть как-то детерминировано, верно?

@Edit: приложение является 32-битным приложением, поэтому работает в 32-битном режиме на Win 7.

  • до физического адресного пространства вы не имеете в виду виртуальное адресное пространство этого процесса? CodesInChaos 16.01.2011
  • И ваша программа настроена на AnyCPU или на 32BitOnly? Нехватка памяти в 64-битной программе не должна происходить легко. Я ожидаю, что компьютер остановится из-за чрезмерной подкачки задолго до этого. CodesInChaos 16.01.2011
  • вы правы: имелось в виду виртуальное адресное пространство. И да, прога компилируется в 32 битное приложение, работает WOW на Win7. user492238 16.01.2011

out-of-memoryswapheap

Ответы

Ответ 1 · рейтинг 8 · Hans Passant

Применяются обычные правила, управляемый процесс не обрабатывается диспетчером памяти Windows иначе. Конечным источником блоков памяти является диспетчер памяти Windows. Если он не может найти дыру в адресном пространстве виртуальной памяти, соответствующую запрошенному выделению памяти, вызов VirtualAlloc() завершается ошибкой, и среда CLR генерирует OOM.

То же самое для поведения подкачки: если страницы в ОЗУ необходимы для сопоставления страниц других процессов или даже страниц того же процесса, они будут заменены. Это никак иначе не связано с OOM.

Вы не можете предположить, что он будет работать на XP точно так же, как и на Win7 x64. Получение OOM на x64 при создании программы, ориентированной на AnyCPU, довольно необычно, 64-разрядная операционная система имеет очень большое адресное пространство виртуальной памяти. Верхний предел задается максимальным размером файла подкачки. 32-разрядная программа будет работать на уровне эмуляции WOW, она может иметь адресное пространство 4 ГБ, если вы установите бит опции LARGEADDRESSAWARE в Editbin.exe.

Вы можете использовать утилиту SysInteral VMMap, чтобы увидеть, как распределено адресное пространство вашего процесса.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы