3

我正在尝试在 .NET 应用程序中查找可能的 I/O 完成线程泄漏。我不时使用ThreadPool.GetAvailableThreads对可用 I/O 完成线程的数量进行采样。在某些时候,可用线程的数量开始从 1000 减少到 1(在几分钟内)。

一旦达到 1 个可用线程,我就看不到任何内存泄漏、错误、执行延迟或类似情况。

在windbg中,运行 !threads 时,我看到~700个线程,其中没有一个来自线程池,其中大部分都标有 XXXX(据我所知,这意味着 GC 还没有收集线程),例如: XXXX 2a4 1630 37d54610 1400 启用 00000000:00000000 004b70d8 0 Ukn (或 MTA)

这个怎么调试?如何查看完成线程的调用堆栈?

运行 !threadpool 时,我得到以下信息:

CPU 利用率:31% 工作线程:总计:2047 运行:2047 空闲:0 MaxLimit:2047 MinLimit:2 队列中的工作请求:0 --------- ----------------- 定时器数量:4 ---------------------------- ---------- 完成端口线程:Total:1000 Free:1 MaxFree:4 CurrentLimit:999 MaxLimit:1000 MinLimit:2

然而,

4

1 回答 1

2

运行 !sos.name2ee mscorlib.dll System.Threading.Thread 并记下 MethodTable。然后运行 ​​!sos.dumpheap -mt [MT]。这将为您提供线程对象的列表。然后运行 ​​!sos.gcroot [THREADOBJ] 来查看它们的作用。

于 2013-01-09T13:33:33.223 回答