Как с пользой прочитать снимок памяти Visual Studio 2019 моей службы C #? - PullRequest
1 голос
/ 21 октября 2019

Я читал другие вопросы, которые возникают, когда я спрашиваю о снимках памяти, но я мог быть слишком толстым, чтобы действительно понять это. У меня есть служба Windows, в которой я могу вызвать утечку памяти, выполняя довольно простую операцию с данными несколько раз. Я сделал снимки памяти по пути, и я вижу, что число корней увеличивается (от 2100 после успешного запуска до 7 100 после примерно 100 операций с данными). Снимки были сделаны с метками синей стрелки:

enter image description here

Перед несколькими операциями с данными снимок памяти выглядит следующим образом:

enter image description here

Впоследствии это выглядит так:

enter image description here

Мы используем WCF для данныхтранспорт, и может показаться, что сериализация играет определенную роль в этом росте памяти, но я не знаю, куда идти дальше. Если я смотрю на экземпляры RuntimeType+RuntimeTypeCache, то подавляющее большинство случаев выглядит так:

enter image description here

Если кто-нибудь может помочь мне разобраться в следующем шагевзять, я был бы очень признателен. У нас есть статический экземпляр, у которого есть параллельный словарь ServiceHosts, к которому я с подозрением отношусь, но я не знаю, как это подтвердить.

РЕДАКТИРОВАТЬ:

Это также кажется значительными относится к ServiceHosts. Можем ли мы разрешить какую-то неразумную генерацию прокси и сохранение экземпляра через эти статические отношения?

enter image description here

1 Ответ

0 голосов
/ 21 октября 2019

Сортируйте предметы по размеру, и внутри этого списка следите за своими типами классов. Какой из них накапливается. Имейте, по крайней мере, всего несколько мегабайт объектов, чтобы увидеть настоящий «кучу», а не только некоторые части инфраструктуры.

12.000 существующих типов времени выполнения могут указывать на динамически создаваемые типы, возможно,DLL сериализации создается для каждого нового вызова.

Вы также можете попытаться выполнить GC.Collect () после вызова критической функции, чтобы включить сборку мусора.

...