我正在尝试在.NET应用程序中找到可能的I / O完成线程泄漏。 我不时使用ThreadPool.GetAvailableThreads对可用的I / O完成线程数进行抽样。 在某些时候,可用线程的数量开始从1000减少到1(几分钟)。
一旦获得1个可用线程,我看不到任何内存泄漏,错误,执行延迟或类似内容。
在windbg中,当运行!线程时,我看到〜700个线程,其中没有来自线程池,大多数都标有XXXX(据我所知,这意味着GC还没有收集线程) , 例如: XXXX 2a4 1630 37d54610 1400启用00000000:00000000 004b70d8 0 Ukn(或MTA)
如何调试这个?我怎样才能看到完成线程的callstack?
运行!threadpool时,我得到以下内容:
CPU利用率:31%工作线程:总计:2047运行:2047空闲:0 MaxLimit:2047 MinLimit:队列中的2个工作请求:0 --------------------------------------计时器数量:4 --------------------------------------完成端口线程:总计:1000免费:1 MaxFree: 4 CurrentLimit:999 MaxLimit:1000 MinLimit:2
然而,
答案 0 :(得分:2)
运行!sos.name2ee mscorlib.dll System.Threading.Thread并记下MethodTable。 然后运行!sos.dumpheap -mt [MT]。这将为您提供线程对象的列表。然后运行!sos.gcroot [THREADOBJ]看看他们持有什么。