Почему делает количество потоков, о которых сообщает WinDbg, Диспетчер задач и Отладчик VS отличаются?

В то время как мое приложение.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 потоков.

У меня есть несколько вопросов:

  • Почему WinDbg заявляет, что существует 456 потоков, и Диспетчер задач говорит 16
  • Почему Диспетчер задач говорит, что существует 16 потоков, и Отладчик Visual Studio говорит 7
  • ! распараллельте шоу команды, что все те мертвые потоки не имеют значения OSID. Это означает, что они больше не известны ОС, и просто объекты .NET, которые являются расположением вокруг? Что такое мертвый поток точно?
  • Я должен волноваться о высоком количестве мертвых потоков?

РЕДАКТИРОВАНИЕ 11-го февраля 2010: Вот больше информации о моем приложении. Мы используем фоновые потоки, чтобы опросить сервер и выполнить другие задачи. Те задачи выполняются каждые несколько минут. Мы не используем.Net Thread Pool.

РЕДАКТИРОВАНИЕ 18-го февраля 2010: Я зафиксировал управляемую утечку объекта Потока в нашей программе (благодаря @highphilosopher). Однако мой вопрос о том, почему WinDbg, Диспетчер задач и Отладчик VS не договариваются о количестве потоков, является все еще оставшимся без ответа. Кто-либо может объяснить?

РЕДАКТИРОВАНИЕ 1-го марта 2010: я все еще интересуюсь знанием, почему Диспетчер задач и Отладчик Visual Studio не договариваются о количестве потоков. Почему Visual Studio фильтрует некоторые потоки? Какие потоки это отфильтровывает?

15
задан Sylvain 1 March 2010 в 17:54
поделиться

3 ответа

Диспетчер задач сообщает общее количество потоков для вашего процесса, а !threads сообщает количество управляемых потоков. Если вы используете команду ~ в WinDbg, вы увидите все потоки для процесса.

Вывод !threads в вашем выводе показывает много мертвых потоков. Потоки, перечисленные с XXXX для id - это потоки, которые завершились, но соответствующие объекты потоков еще не были собраны. Т.е. заявленное число намного больше, чем фактическое число потоков. Число потоков говорит о том, что 449 из 456 потоков мертвы.

Я считаю количество потоков большим, и если приложение простаивало, то странно, что они все еще существуют, но без дополнительной информации трудно сказать что-то определенное.

11
ответ дан 1 December 2019 в 04:40
поделиться

Я предполагаю, что пул потоков имел периоды высокой нагрузки, а затем убил потоки, когда нагрузка уменьшилась.

1
ответ дан 1 December 2019 в 04:40
поделиться

Я также иду с 960 для ширины и около 600 для высоты. Размер браузера Google - это довольно аккуратный способ визуализировать то, что можно ожидать от посетителей.

-121--4950529-

Вам нужен вспомогательный метод:

 private <T> List<T> createList(Class<T> klass) {
          return new ArrayList<T>();
 }
-121--4998144-

То, что вы видите, как вы ссылаетесь на эти потоки в другом потоке. Поскольку на поток имеется ссылка, он не может быть собран GC. Поток завершил выполнение метода, для которого он был отправлен, так что он не находится ни в состоянии сна, ни в состоянии выполнения, поэтому он должен быть неактивным. Проверьте свой код на наличие набора потоков или чего-то подобного. Возможно, событие, которое зацепляется за нить, но никогда не отцепляется?

1
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

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