OutOfMemoryException, большие личные данные - PullRequest
1 голос
/ 31 марта 2010

В предыдущих сериях:

OutOfMemoryException, размер стека огромен, большое количество потоков

У меня есть служба Windows .net, которая потребляет много памяти. Куча GC не большая. Также размер стека не большой. То, что является большим, называется приватными данными. Также я вижу в диспетчере задач, что мое приложение потребляет много чего-то, что менеджер задач называет дескриптором. Мое приложение потребляет 2326 ручек. Я считаю, что эти дескрипторы - это некоторые дескрипторы окон, которые занимают личные данные. Я вижу, что эти личные данные заняты блоки, помеченные как Thread Environment Block . Что это?

Снимок экрана использования памяти моего приложения VMMap

Снимок экрана с использованием памяти моего приложения диспетчером задач

UPDATE

Я запускаю ProcessExplorer. У меня есть два экземпляра моего сервиса, работающего в данный момент. Я вижу, что они потребляют много виртуальной памяти для Gen2 GC. Это выглядит подозрительно. Также общее количество, зарезервированное для размера кучи GC, одинаково для двух процессов.

альтернативный текст http://i021.radikal.ru/1003/27/304433b1ae29.jpg

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

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

Самый эффективный способ избавиться от такой проблемы - использовать WinDBG + SOS и команду! Gcroot. Пример расследования ошибки утечки памяти можно найти здесь: http://blogs.msdn.com/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx

Удачи!

1 голос
/ 31 марта 2010

Да, довольно большой ресурс. Я предполагаю переменные, которые вы пометили атрибутом [ThreadStatic]. У вас путь слишком много потоков.

...