Также обратите внимание, что у вас может не хватить памяти. Что происходит, так это то, что .NET отправляется на поиск смежных блоков памяти, и если он не находит их, он выдает OOM - даже если у вас достаточно общего объема памяти для удовлетворения запроса.
Кто-то ссылался на Perfmon и WinDBG. Вы также можете настроить adplus для захвата дампа памяти при сбое - я считаю, что синтаксис adplus -crash -iis
. Получив дамп памяти, вы можете сделать что-то вроде:
.symfix C:\symbols
.reload
.loadby sos mscorwks
!dumpheap -stat
И это даст вам представление о том, каковы ваши объекты с высокой памятью.
И, конечно же, посмотрите Отличный блог Тесс Фернандес , например эту статью о Утечки памяти с XML-сериализаторами и о том, как их устранять.
Если вы можете воспроизвести это в своей среде разработки, и у вас есть VS Team Edition для разработчиков, есть встроенные профилировщики памяти. Просто запустите новый сеанс производительности и запустите ваше приложение. Из него получится хороший отчет о том, что тусуется.
Наконец, убедитесь, что ваши объекты не определяют деструктор. Это не C ++, и в этом нет ничего детерминированного, кроме того, что он гарантирует, что ваш объект переживет цикл сборки мусора, поскольку его нужно поместить в очередь финализатора, а затем очистить в следующем раунде.