我在使用WinDbg進行轉儲的高內存壓力.net應用程序上進行事後分析,此過程是Windows服務。有很多句柄的.Net應用程序的高內存使用率
我有一種感覺,這個14GB的進程內存消耗大部分來自中止的線程,因此很多孤兒信號/事件/突變體等。但我無法把所有這些放在一起,並像它們一樣添加它們單個信號量/事件/突變體需要多少內存,以及哪種WinDbg命令對這種情況有幫助?
下面是WinDbg的輸出:
處理
**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
解決-summary
--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
<unknown> 471 3`86ea2000 ( 14.108 Gb) 92.40% 0.01%
線程(大量線程的!列出了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
也可能會有所幫助:https://stackoverflow.com/questions/26142607/how-to-use-windbg-to-track-down-net-out-of-memory-exceptions –
帶*號的是*許多未確定的操作系統資源,您難以理解內存使用率高。一個常見的原因是死鎖的終結器線程,一旦發生內存使用率攀升而沒有界限。在小型轉儲中找到它並查看其調用堆棧。 –
@HansPassant似乎終結線程被阻止從以下輸出,但我沒有看到任何地方在代碼中的終結器存在:0:000>〜[2] k 子SP SPAddAddr調用站點 00000017'fd5bf2c8 00007ffc'd340dd29 ntdll!NtWaitForSingleObject + 0xa 00000017'fd5bf2d0 00007ffc'd340b6f4 ntdll!RtlpWaitOnCriticalSection + 0xe1 –