PerfMon と WinDbg のメモリ リークの問題を調査しています。「Large memory heap」カウンターが 10MB から 37MB に増加していることに気付きました。GC を強制した後は、28MB までしか縮小できません。
(何度操作(作成/破棄)を繰り返しても、GC後、大きなオブジェクトヒープは28MBで安定しています)。
どのオブジェクトがリークの問題を引き起こしているかを知りたいので、'!Dumpheap -min 85000' コマンドで WinDbg を実行します。2 つのスナップショットをキャプチャしました。最初のスナップショットは、メモリ リークが発生する前に実行されました。2 つ目は、メモリ リークの後です。
前:
MT Count TotalSize Class Name
6f39fb08 1 89024 System.String
6f3a4aa0 1 107336 System.Byte[]
6f356d84 2 262176 System.Object[]
00360e4c 1 350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][]
6f3a2a94 3 592584 System.Int32[]
00360c24 1 727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][]
0bc78b34 4 2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][]
00730260 10 5375572 Free
後:
MT Count TotalSize Class Name
6f39fb08 1 89024 System.String
6f3a4aa0 1 107336 System.Byte[]
6f3a55d8 2 202080 System.Collections.Hashtable+bucket[]
6f356d84 2 262176 System.Object[]
00360e4c 1 350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][]
00360c24 1 727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][]
6f3a2a94 4 738008 System.Int32[]
6cf02838 1 872488 System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.ComponentModel.PropertyKey, WindowsBase],[MS.Internal.ComponentModel.DependencyPropertyKind, WindowsBase]][]
0bc78b34 4 2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][]
00730260 14 21881328 Free
Total 31 objects
この 2 つのスナップショットを比較すると、最も大きな違いは「Free」のサイズです。そのサイズは 16MB 近く増加しています。「フリー」の意味を誰か教えてもらえますか? フリースペースですか? 増加はフラグメントによるものですか?
この記事によると、「Large Object Heap Size」パフォーマンス カウンターには空き領域が含まれているようです。つまり、私の場合、大きなオブジェクト ヒープでのメモリ リークはそれほど大きくなく、わずか 2MB (= 28 - 10 -16) ですよね?