1

WinDbg とプロセス ダンプを使用して、メモリ負荷の高い .net アプリケーションで事後分析を行っています。このプロセスは Windows サービスです。

このプロセスのメモリ消費量のこの 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

!アドレス -概要

--- 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
4

1 に答える 1

2

ハンドルとそのラッパーはかなり小さい可能性があります。dt -rサイズを把握するために使用します。

0:025> dt -r ntdll!_KSEMAPHORE
   +0x000 Header           : _DISPATCHER_HEADER
      +0x000 Type             : UChar
      +0x001 TimerControlFlags : UChar
      +0x001 Absolute         : Pos 0, 1 Bit
      +0x001 Coalescable      : Pos 1, 1 Bit
      +0x001 KeepShifting     : Pos 2, 1 Bit
      +0x001 EncodedTolerableDelay : Pos 3, 5 Bits
      +0x001 Abandoned        : UChar
      +0x001 Signalling       : UChar
      +0x002 ThreadControlFlags : UChar
      +0x002 CpuThrottled     : Pos 0, 1 Bit
      +0x002 CycleProfiling   : Pos 1, 1 Bit
      +0x002 CounterProfiling : Pos 2, 1 Bit
      +0x002 Reserved         : Pos 3, 5 Bits
      +0x002 Hand             : UChar
      +0x002 Size             : UChar
      +0x003 TimerMiscFlags   : UChar
      +0x003 Index            : Pos 0, 6 Bits
      +0x003 Inserted         : Pos 6, 1 Bit
      +0x003 Expired          : Pos 7, 1 Bit
      +0x003 DebugActive      : UChar
      +0x003 ActiveDR7        : Pos 0, 1 Bit
      +0x003 Instrumented     : Pos 1, 1 Bit
      +0x003 Reserved2        : Pos 2, 4 Bits
      +0x003 UmsScheduled     : Pos 6, 1 Bit
      +0x003 UmsPrimary       : Pos 7, 1 Bit
      +0x003 DpcActive        : UChar
      +0x000 Lock             : Int4B
      +0x004 SignalState      : Int4B
      +0x008 WaitListHead     : _LIST_ENTRY
         +0x000 Flink            : Ptr64 _LIST_ENTRY
         +0x008 Blink            : Ptr64 _LIST_ENTRY
   +0x018 Limit            : Int4B

そのため、セマフォのサイズは 0x18+4 バイトになります。Ptr大量の待機リストがある場合など、パーツを使用するとサイズが大きくなる可能性があることに注意してください。

あなたの状況ではをお勧め!dumpheap -statします。これにより、合計サイズでソートされた .NET オブジェクトのリストが出力されます。

通常、ほとんどのメモリを消費するbyte[]object[](または類似の) およびがあります。String

0:025> !dumpheap -mt 000007feef0aea80
         Address               MT     Size
[...]
000007feef0bda88     4915       329862 System.String
000007feef0be100     1419       382288 System.Object[]
000007feef05f748        2       786520 System.UInt32[]
Total 65575 objects

単一のオブジェクトの場合は、 を使用できます!objsize <address>。私の例の ASystem.Threading.Threadは 16 kB でした。したがって、1000 個のスレッドがある場合でも、これは 16 MB のメモリを補うだけです。私のアプリケーションでは、a の例はSystem.Threading.ManualResetEvent80 バイトしか占めていません。

0:025> !objsize 0000000011878358 
sizeof(0000000011878358) = 16736 (0x4160) bytes (System.Threading.Thread)

0:025> !objsize 00000000118af810 
sizeof(00000000118af810) = 80 (0x50) bytes (System.Threading.ManualResetEvent)
于 2016-03-15T10:14:17.943 に答える