2011-11-14 5 views
3

Я сохранение существующего приложения, и я столкнулся с ошибкой при работе в определенных условиях (легко воспроизводимый), где приложение завершается с сообщением:Краша с «виртуальной памятью»

  • Названия: «Windows - из виртуальной памяти»
  • Содержание: «Windows низкий в виртуальной памяти ...»

Вопрос: что мне нужно проверить в первую очередь? Когда это сообщение происходит? Зачем?

Что хранится в этой виртуальной памяти на C#, почему не хватает памяти?

ответ

11

Похоже, что у вас есть утечка памяти или ресурсов. Время взломать профайлер и посмотреть, что потребляет ресурсы или память.

Хорошие профайлеры включают

http://www.red-gate.com/products/dotnet-development/ants-performance-profiler

и

http://memprofiler.com/

- это прикрепить к запущенному процессу и посмотреть, что из-под контроля.

В общем случае этот вид проблемы может быть вызван объектами, которые реализуют IDisposable, не удаляясь по вызову Dispose(). Память и ресурсы, используемые этими объектами, не управляются сборщиком мусора .NET, поэтому (в отличие от обычных объектов .NET) они не будут автоматически очищены системой.

Профилировщик обычно скажет вам, если это проблема.

Существуют и другие ситуации, в которых это может произойти, например

  • Распределение очень больших блоков памяти, например, 40Gb
  • Очень загруженные системы, которые не имеют возможности правильно собирать мусор, могут превышать их распределение виртуальной памяти.

Опять же, профилировщик расскажет вам, где проблема, скорее всего, будет лгать.

+0

Кажется единственным решением, используйте профайлер. Спасибо за ссылки –

+0

Большинство профайлеров имеют 30-дневную бесплатную пробную версию ... которая может быть полезна! –

+0

Я вижу, что для memprofiler да ;-) –

2

Windows использует Virtual Memory для управления памятью, но виртуальная память не является проблемой здесь. Это указывает на то, что ваше приложение выделяет много памяти - больше, чем доступно в системе.

Некоторые вещи, которые могут вызвать это:

  • Вы используете неуправляемый код где-то, что не удается освободить память.
  • Вы выделяете огромные блоки данных (например, динамический расчет размера массива, который неправильно распределяет 2 ГБ данных).
  • Вы сохраняете ссылки на буферы вокруг дольше, чем необходимо, что мешает сборщику мусора возвращать память.

Не зная больше о вашей заявке, невозможно дать более подробные советы.

+0

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

Смежные вопросы