OutOfMemoryException / ERROR_COMMITMENT_LIMIT с большим количеством свободной памяти в системе - PullRequest
1 голос
/ 24 марта 2011

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

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

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

Программа на самом деле потребляет очень небольшой объем памяти, она 32-разрядная, работает под .NET 4.0.30319, а сервер - Windows Server 2008 с 12 ядрами, 24 ГБ ОЗУ (почти все из которых свободны) и несколько десятков гигабайт свободного места на жестком диске в разделе подкачки.

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

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

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

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

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

0 голосов
/ 07 апреля 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.

...