7

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) ですよね?

4

2 に答える 2

5

FREE は、ヒープ上の未使用のメモリ ブロックを示します。LOH は決して圧縮されないため、LOH 上の FREE ブロックが予期されます。代わりに、LOH 用に空き領域のリストが保持されます。通常の GC ヒープの FREE ブロックは、いくつかの例外を除いて、オブジェクトの固定による断片化を示します。固定されたオブジェクトが GC で検出されると、セグメントの圧縮が停止され、未使用のオブジェクトによって消費されるメモリが FREE としてマークされます。LOH に表示されているのは正常です。LOH が圧縮されることはなく、LOH に割り当てられたメモリ セグメントが解放されることもないため、LOH が縮小されることはありません。

于 2013-01-16T15:09:04.423 に答える
0

大きなオブジェクト ヒープの意味は、ここでよく説明されています

ラージ オブジェクトは、サイズが 85kb を超えるオブジェクトで、その領域に格納され、ジェネレーション 2 が再利用される場合にのみ収集されます。

于 2013-01-16T07:41:10.280 に答える