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

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

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

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

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

@ Редактировать: это 32-битное приложение, поэтому оно работает в 32-битном режиме на Win 7.

1 Ответ

8 голосов
/ 16 января 2011

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

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

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

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

...