メモリーを大量に使うアプリケーションを書いている.NET開発者は、 Large Object Heapアロケーションで何度も問題を経験しているだろう。全体的なメモリーは全く充分あるように見えるのに、メモリー不足例外になってしまう。.NET Framework 4.5は、より良いLOH管理とより少ないフラグメンテーションにより、この領域で改善することを 約束している。
CLRはアロケーションに別々の2つのヒープ、small object heap (SOH) と large object heap (LOH)を管理している。 85,000バイト以上のアロケーションはLOH上に確保される。2つのヒープ間の違いについては これらの 記事が詳しい。LOHにおけるパフォーマンス上のトレードオフのために、大きなイメージ処理のような大量メモリーを必要とするアプリケーションはフラグメンテーションを起こし、メモリーの限界を使い切る前でもメモリー不足例外 になってしまう。
全メモリーのアロケーションに関しては、.NET 3.5 から 4.0ですでにある程度改善がなされている。上記の問題へのコメントの1つとして、.NET FrameworkのGCのリードプログラムマネージャである Brandon Bay氏は、言っている。
提供された例を基に話しますと、.NET 3.5 から 4.0で、LOHにおけるメモリー不足が発生する前に、アロケートできるメモリー量は約23倍になりました。
そして .NET 4.5更に良くなるようだ。
.NET 4.5では、LOHに2つの改善をしました。まず、ランタイムがフリーリストを管理する方法を著しく改善しましたので、フラグメントをずっと効果的に利用できます。メモリーアロケータは、以前は使うことができなかったメモリーフラグメントを再利用します。そして、 サーバーGC モードでは、ランタイムが各ヒープ間でLOHアロケーションのバランスを取ります。.NET 4.5より前では、SOHでしかバランスをとっていませんでした。両方の変更の結果、LOHアロケーションのベンチマークのいくつかで著しい改善を見ることができています。
詳細は、Brandon氏の 完全な投稿 にある。.NET FrameworkのGCについてもっと学びたければ MSDN Documentation や Andrew Hunter氏によるこの記事 を読むとよい。