51

Red Gates ANTS メモリ プロファイラを使用してメモリ リークをデバッグしています。それは私に次のことを警告し続けます:

メモリの断片化が原因で、.NET が過剰な空きメモリを予約している可能性があります。

また

メモリの断片化は、割り当て可能な最大オブジェクトのサイズに影響を与えています

私は OCD を持っているので、この問題を解決する必要があります。

メモリの断片化を回避するのに役立つ標準的なコーディング プラクティスは何ですか。いくつかの .NET メソッドを使用して最適化できますか? それは役に立ちますか?

4

3 に答える 3

11

ご存知のように、私はここでメモリ プロファイラーを疑っています。.NET のメモリ管理システムは、実際にはメモリ内を移動してヒープの最適化を試みます (そのため、外部 DLL と共有するためにメモリを固定する必要があります)。

長期間にわたって大規模なメモリ割り当てを行うと、断片化が進む傾向があります。小さな一時的な (短い) メモリ要求では、.NET で断片化が発生する可能性はほとんどありません。

ここにも、考えるべきことがあります。.NET の現在の GC では、時間的に近くに割り当てられたメモリは、通常、空間内で互いに近くに配置されます。これは断片化の反対です。つまり、アクセスしようとしている方法でメモリを割り当てる必要があります。

それはマネージ コードのみですか、それとも P/Invoke、アンマネージ メモリ (Marshal.AllocHGlobal)、または GCHandle.Alloc(obj, GCHandleType.Pinned) のようなものが含まれていますか?

于 2011-03-09T09:12:18.627 に答える
10

GC ヒープは、ラージ オブジェクトの割り当てを異なる方法で処理します。それらを圧縮するのではなく、隣接する空きブロックを結合するだけです (従来の管理されていないメモリ ストアのように)。

詳細はこちら: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

そのため、非常に大きなオブジェクトに対する最善の戦略は、オブジェクトを一度割り当ててから保持し、再利用することです。

于 2011-03-09T09:22:21.417 に答える