OutOfMemoryException/ERROR_COMMITMENT_LIMIT с МНОГО свободной памяти в системе

Я запускаю свой код на кластере и вижу проблему, которую не могу воспроизвести локально, и не вижу причины.

Итак, программа начинает ложно выбрасывать OutOfMemoryException в случайных местах по всему коду.

Более того, похоже, что это могло быть связано с тем, что что-то сломалось в самой Windows — одно из этих исключений проявилось как HRESULT операции Assembly.Load, где HRESULT был равен 0x800705AF, что при декодировании означает ошибку 1455 ERROR_COMMITMENT_LIMIT (файл подкачки исчерпан).

Программа на самом деле потребляет очень мало памяти, она 32-битная, работает под .NET 4.0.30319, а сервер - Windows Server 2008, с 12 ядрами, 24Gb RAM (почти вся свободна) и несколькими десятками гигабайт свободного места на жестком диске в разделе подкачки.

Как я могу отладить причину этой ошибки вообще? Какие диагностические инструменты использовать?


person jkff    schedule 24.03.2011    source источник
comment
Ваш файл подкачки имеет фиксированный размер или автоматический?   -  person Erik    schedule 24.03.2011
comment
Если вы 32-разрядный, вы ограничены 2 (иногда 3) ГБ адресного пространства процесса. Неважно, сколько фактической памяти имеет сервер — если вам назначено 2 ГБ адресного пространства, у вас фактически не хватает памяти.   -  person Damien_The_Unbeliever    schedule 24.03.2011
comment
@ Дэмиен - я знаю - но на самом деле программа потребляет менее ста мегабайт.   -  person jkff    schedule 24.03.2011


Ответы (2)


Это это способ, которым 64-битный процесс умирает из-за нехватки памяти. Будьте осторожны с тем, на что вы смотрите, чтобы диагностировать это. У вас никогда заканчивается оперативная память, это пространство виртуальной памяти. Вы должны смотреть на число, такое как размер виртуальной машины или личные байты, диспетчер задач слишком много внимания уделяет оперативной памяти.

64-разрядный процесс имеет огромное пространство виртуальной памяти, от 16 гигабайт и выше, в зависимости от того, на какой версии Windows вы работаете. Полностью израсходовать его невозможно, машина умирает обменной смертью, прежде чем вы успеваете приблизиться. Чего, конечно же, операционная система не может допустить, поэтому ERROR_COMMITMENT_LIMIT. На практике 64-разрядный процесс ограничен объемом пространства, которое он может зарезервировать в файле подкачки.

Используйте такой инструмент, как Process Explorer от SysInternals, чтобы взглянуть по-другому. Профилировщик памяти, когда вы видите, что размер виртуальной памяти неограниченно растет.

person Hans Passant    schedule 24.03.2011

Сначала проверьте, работает ли ваше приложение в 32-битном или 64-битном режиме, посмотрите в диспетчере задач, если ваше приложение имеет * 32, в конце это означает, что оно работает в 32-битном режиме. 32-битное приложение имеет только 2 ГБ виртуального адресного пространства для вашего приложения. И OOM происходит, когда ОС не может найти достаточный непрерывный адрес для выполнения вашего запроса памяти приложения. Поэтому, чтобы определить проблему, я бы рекомендовал прочитать статью http://www.codeproject.com/Articles/176031/Out-of-Memory-Exception-A-simple-string-Split-can-.aspx. Если приведенная выше статья не решает вашу проблему, вы можете обратиться к http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx< /а>.

person Vipin Kumar    schedule 07.04.2011