最近、.NETコア2.0アプリケーションでメモリスパイクの問題が発生しました。メモリダンプを分析すると、解放されていない約2GBの空き領域が見つかりました。.NETコアメモリが公開されていません
以下はwindbgツールの統計です。
Statistics:
MT Count TotalSize Class Name
000000e32eaf4ca0 15404 2584481422 Free
メモリが解放されない理由を教えてください。少なくとも次のような理由
最近、.NETコア2.0アプリケーションでメモリスパイクの問題が発生しました。メモリダンプを分析すると、解放されていない約2GBの空き領域が見つかりました。.NETコアメモリが公開されていません
以下はwindbgツールの統計です。
Statistics:
MT Count TotalSize Class Name
000000e32eaf4ca0 15404 2584481422 Free
メモリが解放されない理由を教えてください。少なくとも次のような理由
:
)戻ってOSにそれを与えた後、OSからそれを再利用すると、パフォーマンスに影響があるため、.NETは、それがオペレーティング・システムから得たメモリを維持することがあります。あなたのプログラムが近い将来にあなたのプログラムがメモリを要求すると.NETが考えると、それはあなたのために単純に「キャッシュ」できます。
2)については、例で最も詳しく説明しています。アプリケーションが10 MBを要求したとします。 .NETは、OSから50 MBのブロックを取るかもしれません。その後、アプリケーションは1 MBを要求します。 .NETはそれを既存の50 MBブロックに置きます。 10 MBは解放されます。しかし、OSにメモリを与えることは、それが与えられたのと同じサイズでしか行えないため、.NETは49MBをOSに戻すことはできません。
.NETは、VirtualAlloc()
とVirtualFree()
で直接動作します。したがって、可能性は多少制限されます。
Count
の列を見ると、2.5 GBが連続していないことがわかります。それは15000の断片に分割されます。プログラムでメモリの断片化が発生する可能性があります。メモリー断片化は、固定されたハンドルと大きなオブジェクトヒープのために小さなオブジェクトヒープ上で発生する可能性があります。
固定されたオブジェクトが多すぎます。 –