В то время как мое приложение.Net 3.5 работало, Windows Task Manager, показанный, что мое приложение имело 16 потоков. Я собрал дамп памяти для процесса и открыл его с помощью WinDbg/SOS.
Выполнение! команда потоков показывает, что я имею:
ThreadCount: 456
UnstartedThread: 0
BackgroundThread: 6
PendingThread: 0
DeadThread: 449
Hosted Runtime: no
Вот первые несколько строк! потоки производят:
ID OSID ThreadOBJ State GC Context Domain Count APT Exception 0 1 2848 004366a8 6020 Enabled 11738178:11738778 0042a9f0 0 STA 2 2 1820 004430e0 b220 Enabled 00000000:00000000 0042a9f0 0 MTA (Finalizer) 7 5 2c38 055d6330 80a220 Enabled 00000000:00000000 0042a9f0 0 MTA (Threadpool Completion Port) 8 4 e18 04116900 180b220 Enabled 1157cdc8:1157e778 0042a9f0 0 MTA (Threadpool Worker) XXXX 6 0 055f94b0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 7 0 05649228 9820 Enabled 00000000:00000000 0042a9f0 0 MTA XXXX 8 0 0567d4f8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 9 0 05688d68 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX a 0 056fd680 9820 Enabled 00000000:00000000 0042a9f0 0 MTA XXXX b 0 0575d7f0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX c 0 056fd250 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX d 0 0572a780 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX e 0 0f082668 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX f 0 0f082a38 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 10 0 0570ca68 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 11 0 0570ce50 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn 10 12 3fb0 0570d238 180b220 Enabled 00000000:00000000 0042a9f0 0 MTA (Threadpool Worker) XXXX 13 0 0570d620 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 14 0 0570da08 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 15 0 0570ddf0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 16 0 0570e1d8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 17 0 0570e5c0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 18 0 0579e540 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 19 0 0579e928 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1a 0 0579ed10 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1b 0 0579f0f8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1c 0 0579f4e0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1d 0 0579f8c8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1e 0 0579fcb0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1f 0 057a0098 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 20 0 057a0480 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn
Если я присоединяю Отладчик Visual Studio к рабочему процессу, окна Threads показывает 7 потоков.
У меня есть несколько вопросов:
РЕДАКТИРОВАНИЕ 11-го февраля 2010: Вот больше информации о моем приложении. Мы используем фоновые потоки, чтобы опросить сервер и выполнить другие задачи. Те задачи выполняются каждые несколько минут. Мы не используем.Net Thread Pool.
РЕДАКТИРОВАНИЕ 18-го февраля 2010: Я зафиксировал управляемую утечку объекта Потока в нашей программе (благодаря @highphilosopher). Однако мой вопрос о том, почему WinDbg, Диспетчер задач и Отладчик VS не договариваются о количестве потоков, является все еще оставшимся без ответа. Кто-либо может объяснить?
РЕДАКТИРОВАНИЕ 1-го марта 2010: я все еще интересуюсь знанием, почему Диспетчер задач и Отладчик Visual Studio не договариваются о количестве потоков. Почему Visual Studio фильтрует некоторые потоки? Какие потоки это отфильтровывает?
Диспетчер задач сообщает общее количество потоков для вашего процесса, а !threads
сообщает количество управляемых потоков. Если вы используете команду ~
в WinDbg, вы увидите все потоки для процесса.
Вывод !threads
в вашем выводе показывает много мертвых потоков. Потоки, перечисленные с XXXX
для id - это потоки, которые завершились, но соответствующие объекты потоков еще не были собраны. Т.е. заявленное число намного больше, чем фактическое число потоков. Число потоков говорит о том, что 449 из 456 потоков мертвы.
Я считаю количество потоков большим, и если приложение простаивало, то странно, что они все еще существуют, но без дополнительной информации трудно сказать что-то определенное.
Я предполагаю, что пул потоков имел периоды высокой нагрузки, а затем убил потоки, когда нагрузка уменьшилась.
Я также иду с 960 для ширины и около 600 для высоты. Размер браузера Google - это довольно аккуратный способ визуализировать то, что можно ожидать от посетителей.
-121--4950529-Вам нужен вспомогательный метод:
private <T> List<T> createList(Class<T> klass) {
return new ArrayList<T>();
}
-121--4998144- То, что вы видите, как вы ссылаетесь на эти потоки в другом потоке. Поскольку на поток имеется ссылка, он не может быть собран GC. Поток завершил выполнение метода, для которого он был отправлен, так что он не находится ни в состоянии сна, ни в состоянии выполнения, поэтому он должен быть неактивным. Проверьте свой код на наличие набора потоков или чего-то подобного. Возможно, событие, которое зацепляется за нить, но никогда не отцепляется?