终结器线程被阻塞

4
我正在使用WinDbg和进程转储对一个内存占用压力较高的.NET应用程序进行事后分析,这个进程是一个Windows服务。
根据以下输出结果来看,似乎终结器被阻塞了。
我搜索了代码,但没有发现任何可疑的 finalize 方法会阻塞线程。有哪些常见模式可以寻找这种行为?
是否有其他的WinDBG命令可以帮助我进行进一步的诊断?
谢谢。
0:000> ~[2]k
Child-SP          RetAddr           Call Site
00000017`fd5bf2c8 00007ffc`d340dd29 ntdll!NtWaitForSingleObject+0xa
00000017`fd5bf2d0 00007ffc`d340b6f4 ntdll!RtlpWaitOnCriticalSection+0xe1
00000017`fd5bf3a0 00007ffc`ca95ec1b ntdll!RtlpEnterCriticalSectionContended+0xa4
00000017`fd5bf3e0 00007ffc`ca7a8180 clr!CrstBase::Enter+0x119
00000017`fd5bf410 00007ffc`ca9582cc clr!ThreadStore::LockThreadStore+0x68
00000017`fd5bf440 00007ffc`ca95829b clr!Thread::CleanupDetachedThreads+0x2c
00000017`fd5bf4a0 00007ffc`ca8a603b clr!Thread::DoExtraWorkForFinalizer+0x186
00000017`fd5bf4d0 00007ffc`ca960805 clr!WKS::GCHeap::FinalizerThreadWorker+0x10c
00000017`fd5bf510 00007ffc`ca96078c clr!ManagedThreadBase_DispatchInner+0x2d
00000017`fd5bf550 00007ffc`ca9606f5 clr!ManagedThreadBase_DispatchMiddle+0x6c
00000017`fd5bf650 00007ffc`ca8eb377 clr!ManagedThreadBase_DispatchOuter+0x75
00000017`fd5bf6e0 00007ffc`ca95e8b6 clr!WKS::GCHeap::FinalizerThreadStart+0xd7
00000017`fd5bf780 00007ffc`d0d713d2 clr!Thread::intermediateThreadProc+0x7d
00000017`fd5bf840 00007ffc`d33e5454 kernel32!BaseThreadInitThunk+0x22
00000017`fd5bf870 00000000`00000000 ntdll!RtlUserThreadStart+0x34

2
你可以运行 analyze -v -hang 命令,并使用输出结果切换到阻塞线程并获取该线程的堆栈跟踪 ~<blockingthread>; kbnf。如果你发布输出结果,肯定会得到新的指引,从而知道接下来该怎么做。 - Lieven Keersmaekers
1个回答

0

这个转储中的Finalizer线程被阻塞了,但这可能没问题。毕竟,锁定是经常发生的。为了确定您是否真的有问题,您需要查看f-reachable队列中有多少对象。您可以使用!sos.finalizequeue!sosex.frq来查看。

确保还要检查!sos.dumpheap的输出,以查看您的问题是否是内存泄漏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接