【发布时间】:2016-03-15 09:50:48
【问题描述】:
我正在使用带有进程转储的 WinDbg 对内存压力高的 .net 应用程序进行事后分析,该进程是 Windows 服务。
我感觉这 14GB 进程内存消耗中的大部分来自中止的线程,因此有很多孤立信号量/事件/突变等。但我无法将所有这些放在一起并将它们加起来就像多少单个信号量/事件/突变所需的内存以及哪种 WinDbg 命令对这种情况有帮助?
以下是 WinDbg 输出:
!handle
**Type Count**
None 90
Event 5550
Section 41
File 1166
Directory 3
Mutant 160
Semaphore 4581
Key 78
Token 2
Thread 553
IoCompletion 6
Timer 1
TpWorkerFactory 3
ALPC Port 9
WaitCompletionPacket 33
!address -summary
--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
<unknown> 471 3`86ea2000 ( 14.108 Gb) 92.40% 0.01%
!threads(列出的许多线程都有 ThreadAbortException 异常)
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
12 3 33f0 00000017e3c23200 1282b221 Preemptive 0000000000000000:0000000000000000 00000017e3bb3930 1 MTA System.Threading.ThreadAbortException 000000181de5d668
【问题讨论】:
-
由于那许多未完成的操作系统资源,难怪您会看到高内存使用率。一个常见的原因是死锁的终结器线程,一旦发生这种情况,内存使用量就会无限攀升。在 minidump 中找到它并查看它的调用堆栈。
-
@HansPassant 似乎终结器线程确实被以下输出阻止了,但我在代码中没有看到终结器存在的任何地方:0:000> ~[2]k Child-SP RetAddr呼叫站点 00000017
fd5bf2c8 00007ffcd340dd29 ntdll!NtWaitForSingleObject+0xa 00000017fd5bf2d0 00007ffcd340b6f4 ntdll!RtlpWaitOnCriticalSection+0xe1 -
它几乎总是被阻塞,重要的是它是否死锁。您发布的堆栈跟踪信息不足以让我们看到。考虑致电 Microsoft 支持以获取相关帮助。
标签: .net windows-services windbg postmortem-debugging