OutOfMemoryException, размер стека огромен, большое количество потоков - PullRequest
2 голосов
/ 30 марта 2010

Я профилировал свою службу Windows .net. Я пытался обнаружить OutOfMemoryException и обнаружил, что мой размер стека огромен и растет, потому что количество потоков продолжает расти.

Каждый поток получает 1024 КБ на компьютере с Windows x64. Таким образом, когда мое приложение имеет 754 потоков, размер стека будет 772 МБ . Проблема для меня в том, что я не знаю, откуда взялись эти темы. Изначально у моего приложения было очень ограниченное количество потоков, и они со временем продолжают расти.

У меня есть два подозрения - эти потоки создаются WCF или подключением к базе данных. Мое приложение использует как WCF, так и наборы данных. Также я попытался профилировать свое приложение в Ants do Trace, я вижу большое количество System.ServiceModel.Channels.ClientReliableDuplexSessionChannel и это число увеличивается со временем. Я вижу тысячи созданных объектов. Поэтому я хочу знать, кто создает потоки (инструменты для обнаружения, профилировщики) и создает ли эти потоки WCF.

UPDATE

Я остановился в отладчике моего приложения, чтобы посмотреть на потоки. Все, что я вижу, это большое количество потоков 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 Ответ

3 голосов
/ 30 марта 2010

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

...