@sheich
Всем привет!
Столкнулись с такой проблемой: по мере работы .net 6.0 сервис, запущенный как Windows-служба, отъедает на машине все больше и больше потоков (см. Task Manager, колонка Threads) и не убивает их. Web API приложения обслуживает много несложных запросов. Вроде бы ничего некорректного в коде нет: много где внутренние сервисы вызываются через DI, using, применяются финализаторы, сборка мусора и т.п. Но периодически кол-во потоков начинает зашкаливать и вообще непонятно, куда смотреть.
Показатель Process.GetCurrentProcess().Threads.Count действительно очень большой.
Методы типа ThreadPool.SetMaxThreads() ничего не дают ((
В какую сторону смотреть?
Help!
Столкнулись с такой проблемой: по мере работы .net 6.0 сервис, запущенный как Windows-служба, отъедает на машине все больше и больше потоков (см. Task Manager, колонка Threads) и не убивает их. Web API приложения обслуживает много несложных запросов. Вроде бы ничего некорректного в коде нет: много где внутренние сервисы вызываются через DI, using, применяются финализаторы, сборка мусора и т.п. Но периодически кол-во потоков начинает зашкаливать и вообще непонятно, куда смотреть.
Показатель Process.GetCurrentProcess().Threads.Count действительно очень большой.
Методы типа ThreadPool.SetMaxThreads() ничего не дают ((
В какую сторону смотреть?
Help!
Решения вопроса 2
@Griboks
Возможно, у вас не отрабатывает сборка (если отбросить ошибки в коде). Существует редкая ошибка утечки памяти, когда контекст переменной != контекст сборки мусора. Попробуйте избавиться от создания объектов внутри циклов и условий, а перенести всё это в отдельные функции.
Ответы на вопрос 2
@AshBlade
Смотреть в сторону разницы:
Скорее всего какой-то сервис создает множество потоков (ручных) и держит ссылки на них, т.к. поток это объект ядра и он должен быть уничтожен когда на него перестают ссылаться, либо это просто поток, который не завершатся (
Process.GetCurrentProcess().Threads.Count
и ThreadPool.ThreadCount
Скорее всего какой-то сервис создает множество потоков (ручных) и держит ссылки на них, т.к. поток это объект ядра и он должен быть уничтожен когда на него перестают ссылаться, либо это просто поток, который не завершатся (
while (true)
какой-нибудь)
@mindtester
любой прототип процесса можно дебажить как консоль (или множество)..
отладчик в руки!
отладчик в руки!
ps а так то утечка… вопрос чего? ;))
pps отладочные записи в лог файлы, или в журнал.. ну это уже для процесса.
для консолей — консоль и сила в отладке ))