#c# #.net #memory-management
#c# #.net #управление памятью
Вопрос:
Я поддерживаю существующее приложение и столкнулся с ошибкой при запуске в некоторых условиях (легко воспроизводимых), когда приложение завершается сбоем с сообщением :
- Заголовок: «Windows — Нехватка виртуальной памяти»
- Содержимое: «Windows не хватает виртуальной памяти …»
Вопрос в том, что мне нужно проверить в первую очередь? Когда появляется это сообщение? Почему?
Что хранится в этой виртуальной памяти в C #, почему не хватает памяти?
Ответ №1:
Похоже, у вас какая-то утечка памяти или ресурсов. Время взломать профилировщик и посмотреть, что потребляет ресурсы или память.
Хорошие профилировщики включают
http://www.red-gate.com/products/dotnet-development/ants-performance-profiler
и
— это подключится к вашему запущенному процессу и покажет, что вышло из-под контроля.
В общем случае проблема такого рода может быть вызвана тем, что объекты, которые реализуют, IDisposable
не удаляются с помощью вызова Dispose()
. Память и ресурсы, используемые этими объектами, не управляются .СЕТЕВОЙ сборщик мусора, поэтому (в отличие от обычных объектов .NET) они не будут очищены системой автоматически.
Профилировщик обычно сообщит вам, является ли это проблемой.
Существуют другие ситуации, когда это может произойти, например
- Выделение очень больших блоков памяти, например массивов объемом 40 Гб
- Очень сильно загруженные системы, у которых нет возможности правильно собрать мусор, могут превысить выделенную им виртуальную память.
Опять же, профилировщик скажет вам, в чем, скорее всего, заключается проблема.
Комментарии:
1. Кажется, это единственное решение, используйте профилировщик. Спасибо за ссылки
2. У большинства профилировщиков есть 30-дневная бесплатная пробная версия … которая может быть полезной!
Ответ №2:
Windows использует виртуальную память для управления памятью, но виртуальная память здесь не проблема. Это указывает на то, что ваше приложение выделяет много памяти — больше, чем доступно в системе.
Некоторые вещи, которые могут вызвать это:
- Вы где-то используете неуправляемый код, который не освобождает память.
- Вы выделяете огромные блоки данных (например, динамическое вычисление размера массива, которое неправильно выделяет 2 ГБ данных).
- Вы сохраняете ссылки на буферы дольше, чем необходимо, что не позволяет сборщику мусора восстановить память.
Не зная больше о вашем приложении, невозможно дать какие-либо более подробные подсказки.
Комментарии:
1. Я новичок в приложении и на данный момент не могу предоставить больше информации.
Ответ №3:
Очевидно, что ваше приложение занимает много памяти. Вы можете прочитать о виртуальной памяти здесь: http://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx