2017-11-24 27 views
0

最近、.NETコア2.0アプリケーションでメモリスパイクの問題が発生しました。メモリダンプを分析すると、解放されていない約2GBの空き領域が見つかりました。.NETコアメモリが公開されていません

以下はwindbgツールの統計です。

Statistics: 
MT     Count TotalSize  Class Name 
000000e32eaf4ca0 15404 2584481422  Free 

メモリが解放されない理由を教えてください。少なくとも次のような理由

+1

固定されたオブジェクトが多すぎます。 –

答えて

0

  • .NETは、あなたのプログラムが
  • 完全なブロックを構成していないメモリの空き部分
  • は、OSに恩返しするために再びすぐにそのメモリを必要とすることを考えています1.について

)戻って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の断片に分割されます。プログラムでメモリの断片化が発生する可能性があります。メモリー断片化は、固定されたハンドルと大きなオブジェクトヒープのために小さなオブジェクトヒープ上で発生する可能性があります。