物語:
.NET2.0アプリケーションで管理されていないメモリリークに直面しています。開始後のプロセスは約150MBを消費します(そのほとんどは.NETで管理され、オブジェクトの状態などです)。約12時間の実行後、プロセスは最大800MBを消費し、次の12時間後、プロセスには約1.8GBのRAMが搭載されます。JetBrains .NET Memory Profiler、ANTS、.NET Memory Profiler(およびおそらく市場で入手可能な2つの次のmemプロファイル)を試しましたが、後で検出すると、プロセスが管理されていない非管理領域で大量のメモリを消費するため、これは役に立ちません。これを検出するために、カウンター付きのPerfモニターを使用しました:Private Bytes(Process)および#Bytes in All Heaps(.NET CLR Memory)ここで、Private Bytesはプロセスによって割り当てられたすべてのメモリの約90%を消費します。これが、アンマネージデバッグに切り替える理由です。
DebugDiag:プロセスでdebugdiagを実行し、完全なダンプを取得します。スナップショットは次のとおりです。
mscorwks.dll(既知のWindowsメモリマネージャー)は、781,73Mバイト相当の未処理の割り当てを担当します。これらの割り当ては、次のモジュールおよび機能から発生したようです。
ntdll.dll(既知のWindowsメモリマネージャー)は、98,24Mバイト相当の未処理の割り当てを担当します。これらの割り当ては、次のモジュールおよび機能から発生したようです。
割り当て数による上位4つの機能
- mscorwks!EEHeapAlloc +15b-80957割り当て
- mscorwks!CLRMapViewOfFileEx +4a-4171割り当て
割り当てサイズ別の上位4つの機能
- mscorwks!EEVirtualAlloc +15b-117,50Mバイト
- mscorwks!EEHeapAlloc +15b-15,03Mバイト
興味深いログが見つかりました:
機能詳細
Function mscorwks!EEVirtualAlloc+15b
- 割り当てタイプ仮想メモリの割り当て
- 割り当てカウント1471割り当て
- 割り当てサイズ117,50Mバイト
- リーク確率73%
Function mscorwks!EEHeapAlloc+15b
- 割り当てタイプヒープ割り当て
- 割り当てカウント80957割り当て
- 割り当てサイズ15,03Mバイト
- リーク確率72%
Function mscorwks!CExecutionEngine::CheckThreadState+fe
- 割り当てタイプヒープ割り当て
- ヒープハンドル0x00000000`00000000
- 割り当てカウント2割り当て
- 割り当てサイズ304バイト
- リーク確率98%
Function mscorwks!CLRMapViewOfFileEx+4a
- 割り当てタイプ仮想メモリの割り当て
- 割り当てカウント4171割り当て
- 割り当てサイズ0バイト
- リーク確率73%
誰かに私を正しい方向に押してもらいたいのですが、どうすればこのダンプからのメモリリークを見つけることができますか?ダンプをwindbgにロードして、windbgコマンドの標準セットを実行することはできますが、リークを分離できる適切なコマンドがどれであるかわかりません。
誰かがこれを手伝いたいなら、私は完全なダンプを提供することができます。