それについて考えるのに役立つ方法は、次のとおりです。メモリはディスクスペースです。RAMは高速キャッシュです。「RAMが不足すると、システムはそれをディスクにスワップする」と考えるのではなく、「利用可能なRAMがあれば、システムはディスク上のメモリをそこに移動する」と考えています。
それはほとんどの人が考える方法とは逆ですが、私はそれが役立つと思います. RAM は単なるパフォーマンスの最適化です。割り当てることができるメモリ量の実際の制限は、使用可能なディスク領域です。
もちろん、それはそれよりも複雑です。32 ビット オペレーティング システムでは、すべてのプロセスが 20 億バイトのユーザー アドレス空間を取得します。(カーネルのアドレス空間についても同じですが、無視しましょう。) アクセスできるメモリのすべてのページは、RAM にあるかディスクにあるかに関係なく、そのアドレス空間にある必要があります。20 億バイト以上を割り当てても問題ありません。ただし、一度にアドレス指定できるのは 2 GB までです。10 GB を割り当てた場合、少なくとも 8 GB はアドレス空間にマップされません。その場合、何か他のもののマップを解除してから、必要なものをアドレス空間にマップして、それを取得する必要があります。
さらに、多くのものが連続したアドレス空間にある必要があります。たとえば、1MB のスタックがある場合、アドレス空間で使用できる 連続する 100 万バイトが必要です。
「メモリが不足している」場合、RAM が不足しているわけではありません。RAM は、ディスク上の単なる高速キャッシュです。また、ディスク容量が不足しているわけではありません。それはたくさんあります。ほとんどの場合、要求を満たすには連続したアドレス空間が不足している状況にあります。
CLR メモリ マネージャーは、これらの派手なマップおよびマップ解除戦略を実装していません。基本的に、2GB のアドレス空間を取得するだけです。メモリ マップされたファイルなど、凝ったことをしたい場合は、自分でメモリを管理するコードを書く必要があります。