Исключение .NET OutOfMemory - PullRequest
       6

Исключение .NET OutOfMemory

2 голосов
/ 01 октября 2009

У нас есть приложение .NET, работающее более года. Это фоновый сервис, и он написан так: если по какой-либо причине происходит сбой, он автоматически перезапускается. До недавнего времени он не доставлял нам никаких головных болей, несмотря на большую нагрузку, которую он обрабатывает ежедневно, но теперь каждый раз в голубой луне он падает с исключением OutOfMemorey. После перезапуска он обнаруживает, где произошел сбой, и делает все, что должен, поэтому клиенту все равно, но я хотел бы понять, что вызывает сбой.

Поэтому вопрос: есть ли способ изучить сбой БЕЗ повторного развертывания приложения? Я хотел бы создать аварийный дамп или что-то в этом роде, а затем вручную выполнить дамп в попытке выяснить, какие объекты съели всю мою память. Какие инструменты вы бы мне предложили использовать, чтобы облегчить эту задачу?

1 Ответ

4 голосов
/ 01 октября 2009

Вам может пригодиться следующая статья из MSDN:

Производственная отладка для приложений .NET Framework

http://msdn.microsoft.com/en-us/library/ms954591.aspx

Несмотря на то, что в нем подробно рассматриваются приложения ASP.NET, некоторые из описанных методов так же действительны при выполнении анализа памяти в сервисах или автономных приложениях.

Возможно, вы также захотите использовать Perfmon для подключения к процессу и посмотреть, значительно ли увеличивается объем кучи Gen 1 или Gen 2 - это обычно указывает на объекты, которые пережили слишком много сборок мусора и создали память давление в вашем приложении. Возможно, вы также захотите взглянуть на размер метрики «Частные байты» - рост там показывает, что для вашего процесса выделяется много неуправляемой памяти.

Анализ производительности полезен, потому что он может показать сверхурочное использование памяти и помочь определить, ответственны ли определенные типы обработки или транзакции за потребление памяти.

Если вы можете воспроизвести проблему в тестовой среде, есть превосходный профилировщик памяти от сотрудников Red Gate Software , который может помочь выявить такие проблемы за долю времени, которое потребуется для копания дампы памяти.

Есть некоторые инструменты, которые могут работать в фоновом режиме (например, DebugDiag), которые позволяют периодически генерировать дампы памяти или при возникновении определенных событий. Вы можете прочитать о них здесь:

http://blogs.msdn.com/sukeshak/pages/ddintro.aspx

http://blogs.msdn.com/tess/archive/2009/01/23/net-hang-analyzing-debug-diag-output.aspx

...