マネージ ヒープよりも大きい非常に大きなオブジェクトを物理メモリに保存しようとするとどうなりますか? たとえば、フィルムのサイズは 4.5 GB で、仮想メモリ (RAM) のサイズはわずか 2 GB です。この場合、ガベージコレクターはどのように機能しますか? (物理的なスペースは十分です)
3 に答える
メモリが不足することは明らかです。この場合、MemoryOutOfExceptionが発生し、gcはそれについて何もできません。
.NET 4.5 CLRでは、構成を変更することで、サイズが2GBを超えるオブジェクトのサポートをオンにできます。ただし、配列インデックスはに制限されてint.MaxValue
いるため、より大きな要素タイプを使用する場合にのみ、そのサイズのオブジェクトを作成できますbyte
(これは、バイトを格納しているため、この場合は必要ありません)。
したがって、現在のバージョン(4.5)では、そのような配列を割り当てることさえできません。もしそうなら、それはLOHに保存されます。
とにかく、このような大きなファイルを保存する必要があり、一般的に望ましいストリーミングアプローチを使用したくない場合は、Marshal.AllocHGlobal
またはを使用することをお勧めしますVirtualAlloc
。それらは本質的に安全ではありませんが、制限を課すことはありません。
マネージ ヒープよりも大きい非常に大きなオブジェクトを物理メモリに保存しようとするとどうなりますか?
最後に確認してから CLR が進化したかどうかはわかりませんが、私が知る限り、v4 CLR の 64 ビット バージョンでさえ、2GB を超える単一のオブジェクトをサポートしていません。より多くの物理メモリを取得しました。