我有一个Windows服务,它在一个单独的线程中运行数据库任务(How to diagnose why a Threadstatic connection is not garbage collected中有更详细的描述)。该服务应该一次只运行一个后台线程。据观察,该服务不会正确释放资源(尤其是数据库连接)。我已经分析了内存转储,并且有越来越多的空闲线程:
!ThreadPool
CPU utilization: 0%
Worker Thread: Total: 65 Running: 0 Idle: 65 MaxLimit: 1023 MinLimit: 4
Work Request in Queue: 0
--------------------------------------
Number of Timers: 1
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 8 CurrentLimit: 1 MaxLimit: 1000 MinLimit: 4
主题列表(缩短):
!threads
ThreadCount: 80
UnstartedThread: 0
BackgroundThread: 70
PendingThread: 0
DeadThread: 8
Hosted Runtime: no
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 34e8 005c0d98 2a020 Preemptive 00000000:00000000 005bb308 0 MTA
2 2 1308 005ce540 2b220 Preemptive 00000000:00000000 005bb308 0 MTA (Finalizer)
3 6 2580 00659908 102a220 Preemptive 00000000:00000000 005bb308 0 MTA (Threadpool Worker)
5 7 1130 00698cc8 202b020 Preemptive 100EFE68:00000000 005bb308 0 MTA
8 10 3540 04133f00 202b220 Preemptive 0FE8EFC4:00000000 005bb308 1 MTA
11 20 3518 09253c30 1020220 Preemptive 00000000:00000000 005bb308 0 Ukn (Threadpool Worker)
12 14 44e4 0dc8e5c0 1029220 Preemptive 0FE8EA6C:00000000 005bb308 0 MTA (Threadpool Worker)
13 9 3bfc 0dc8eb08 1029220 Preemptive 0FE40EA4:00000000 005bb308 0 MTA (Threadpool Worker)
14 16 4328 04133470 1029220 Preemptive 0FF6CEA4:00000000 005bb308 0 MTA (Threadpool Worker)
.....
75 73 3b78 0e93a5b0 1029220 Preemptive 100973E0:00000000 005bb308 0 MTA (Threadpool Worker)
76 74 2ab4 0e93c018 1029220 Preemptive 10056368:00000000 005bb308 0 MTA (Threadpool Worker)
XXXX 90 0 0de36520 39820 Preemptive 00000000:00000000 005bb308 0 Ukn
XXXX 78 0 0e93aaf8 8039820 Preemptive 00000000:00000000 005bb308 0 Ukn (Threadpool Completion Port)
XXXX 77 0 1106fa78 39820 Preemptive 00000000:00000000 005bb308 0 Ukn
XXXX 75 0 0e93b588 39820 Preemptive 00000000:00000000 005bb308 0 Ukn
XXXX 76 0 10d53a78 39820 Preemptive 00000000:00000000 005bb308 0 Ukn
XXXX 80 0 0e93d538 39820 Preemptive 00000000:00000000 005bb308 0 Ukn
77 82 2040 1106dac8 8029220 Preemptive 00000000:00000000 005bb308 0 MTA (Threadpool Completion Port)
XXXX 86 0 1106e010 39820 Preemptive 00000000:00000000 005bb308 0 Ukn
XXXX 89 0 041339b8 39820 Preemptive 00000000:00000000 005bb308 0 Ukn
线程堆栈大多数线程看起来都是一样的:
~70kB
# ChildEBP RetAddr Args to Child
00 1247fbf4 75492cc7 00000268 00000000 1247fc3c ntdll!NtWaitForSingleObject+0xc
01 1247fc68 748c2396 00000268 00004e20 00000000 KERNELBASE!WaitForSingleObjectEx+0x99
02 1247fccc 748c25e7 00004e20 00000000 0e93caa8 clr!CLRSemaphore::Wait+0xc0
03 1247fd08 748c2681 00004e20 0a7a6632 748c1fe0 clr!ThreadpoolMgr::UnfairSemaphore::Wait+0x132
04 1247fd74 748d5dd1 00000000 748d5db7 748d5d80 clr!ThreadpoolMgr::WorkerThreadStart+0x389
05 1247fd90 76cf7c04 005f7c48 76cf7be0 08601cd5 clr!Thread::intermediateThreadProc+0x55
06 1247fda4 778cad2f 005f7c48 0929786d 00000000 kernel32!BaseThreadInitThunk+0x24
07 1247fdec 778cacfa ffffffff 778b00a2 00000000 ntdll!__RtlUserThreadStart+0x2f
08 1247fdfc 00000000 748d5d80 005f7c48 00000000 ntdll!_RtlUserThreadStart+0x1b
据我所知,现在是在游泳池中等待的线程。 有没有办法继续分析?线程是否以某种方式被阻止?