我正在尝试在 .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
然而,