投稿日:

WPF OutOfMemory が多発する。(続報)

この前のエントリーで書いた「WPF OutOfMemory が多発する。」の続報です。

で? 結局何が原因だったの?

今回、OutOfMemoryが多発した原因は、あんまり WPF には関係なさそう。

ズバリ、原因を言ってしまえばマネージヒープの断片化でしょう。

マネージヒープ断片化の発生原因

C#のGCは、通常の利用であればメモリが確保できなくなるレベルでの断片化を起こしたりしません。

ですが、今回は85,000Byte以上のObjectを大量に確保と破棄を繰り返していました。
85,000Byteを超えるObjectは、Large Object Heep (LOH)と言う、別のアドレス空間に割り振られます。

そして、大問題がGCはこのLOHに対してメモリコンパクション、断片化の解消を行わないのです!!
唯でさえ、確保と破棄を繰り返して断片化が起こりやすい状況にあるので、
正に「最悪のシナリオ」って奴だったのね。

どうすんのよ??

対策可能な.Net FrameworkのVersionは 4.5.1以降。
幸いなことに、今回のターゲット環境は .Net Framework 4.6
対策していきましょうか。

これで、LOHに対するメコリコンパクションが有効になった!

後は、大きなメモリを確保するにGCを起動しておきましょう。

最後に

この対策をしてからまだ、OutOfMemoryに遭遇していないので、これで解決したんじゃないかな?

続報有ればまた書きます。

参考

  • http://qiita.com/mima_ita/items/8303f2a476e8630f0728
コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です