Ethiopian
@Ethiopian

Как узнать количество инстанций и расход памяти в .NET?

Приветствую,

проблема в следующем: есть клиент-серверное приложение на C#, у которого серверная часть иногда течет памятью. Сейчас пытаемся написать что-то типа встроенного профайлера, который мог бы в реальном времени с установленного сервера слать на клиент статистику по потреблению памяти.

Вопрос в следующем:
Есть ли в .NET возможность узнать классы, потребляющие наибольший объем памяти и количество их инстанций напрямую из кода, не прибегая к помощи сторонних профайлеров типа ANTS?
  • Вопрос задан
  • 690 просмотров
Пригласить эксперта
Ответы на вопрос 3
lasalas
@lasalas
.NET Architect
Проблема в том, что сканирование объектов через Debugging API требует "заморозки" приложение на время сканирования, соответственно оно не может сканировать себя, поэтому в любом случае нужен внешний отладчик (профайлер).

По опыту, источником утечек обычно являются static объекты и подписки на события.

Рекомендую dotTrace, он имеет в т.ч. и удаленный профайлер.

Еще: "заморозка" может длиться достаточно долго, что может быть критично при использовании на "боевом" сервере.
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
в Community версии есть встроенный профайлер, дает очень достаточно информации
Ответ написан
Очень не понятно слово "инстанций", думается что это экземпляры объектов.
Получить память можно через счетчики Windows "Системный монитор" (даже удаленно можно читать, они работают всегда и не грузят практически, выбираем процесс и смотрим GC_time, GEN_1,2,3 etc., счетчиков очень много), или подписаться на ETW в своем приложении если .NET 4.5 (на нем проще) и писать в лог события от внутренних компонентов Windows (CLR, Kernel).
Снимать дампы через sysinternals suite софт, или диспетчером задач, или использовать PerfView.
На днях статью сделаю "заметки 2.0", там все подробней с JIT-от :)

UPD: снимаем 2 дампа в разное время, находим новые объекты во втором (они будут если есть утечка), находим кто их удерживает (1 команда в Windbg).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы