OutOfMemoryException, размер стека огромен, большое количество потоков
Я профилировал мой сервис Windows.net. Я пытался обнаружить OutOfMemoryException и обнаружил, что мой размер стека огромен и растет, потому что количество потоков продолжает расти.
Каждый поток получает 1024 КБ на компьютере с Windows x64. Таким образом, когда мое приложение имеет 754 потока, размер стека будет 772 МБ. Проблема для меня в том, что я не знаю, откуда взялись эти темы. Изначально в моем приложении очень ограниченное количество потоков, и они со временем растут.
У меня есть два подозрения - либо эти потоки создаются WCF или подключением к базе данных. Мое приложение использует как WCF, так и наборы данных. Также я попытался профилировать свое приложение в Ants do Trace, я могу видеть большое количество System.ServiceModel.Channels.ClientReliableDuplexSessionChannel
и это число увеличивается со временем. Я вижу тысячи таких созданных объектов. Итак, я хочу знать, кто создает потоки (инструменты для обнаружения, профилировщики) и создает ли эти потоки WCF.
ОБНОВИТЬ
Я остановился в отладчике моего приложения, чтобы посмотреть на потоки. Все, что я могу видеть большое количество потоков Win32 с таким стеком вызовов
ntdll.dll!7c82860c()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c827d99()
kernel32.dll!77e4e02f()
mscorwks.dll!79e7c7a8()
mscorwks.dll!79f943fe()
mscorwks.dll!79f94237()
mscorlib.ni.dll!792f5577()
mscorlib.ni.dll!792e01c5()
1 ответ
Вы можете посмотреть на программу с помощью отладчика - тогда вы сможете увидеть, что делают все эти потоки (большинство из них, вероятно, имеют очень похожий стек вызовов).