2009-06-11 7 views
9

.NETのオブジェクトの最大サイズが2 GBであることがわかりました(http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx)。.NET最大メモリx64アセンブリでも2GBを使用

256MBのメモリを占有しているオブジェクトがある場合は参照型なので、すべてのオブジェクトが一緒に2GB以上のメモリを占有する256 MBのオブジェクトの配列を持つことができます参照配列のサイズが2 GB未満にとどまっていれば長いですか?

+0

興味深い質問。私は64ビットマシンにこの制限があることは知らなかった。それは、私は1つのオブジェクトで2GBを保持するアプリのための多くのシナリオを考えることができないと言いました! – RichardOD

+0

私は同意すると、単一のオブジェクトに2GB以上必要なシナリオはあまりありません。ゲームサーバーまたはデータベースサーバーは、実際には念頭に置く唯一のものです。 – Nate

答えて

10

はい、あなたの前提は正しいです。

2GBの制限は、各オブジェクトに個別に適用されます。すべてのオブジェクトに使用される合計メモリは2GBを超えることができます。

(32ビットマシンで2GBのスペアメモリが見つかる可能性はありますが、64ビットでは問題ありません)

+0

"参照配列"は、(通常) "整数配列"と同じ量の領域を占めるオブジェクトになりますか? – Nate

+1

Nate>実装の詳細ですが、参照は現在ポインタであるため、ポインタのサイズと同じサイズになります(ほとんどのシステムでsizeof(int)と同じですが、C#intは常にInt32を意味します) –

+0

これは.NETのArrayクラスには、配列の長さが長い引数を取る特別なメソッドがあることを考えると、奇妙なことです。制限が2GBの場合、配列の長さが32ビットintをオーバーフローすることは不可能です。 – Qwertie

6

".NET 4以前では、64ビットプロセスでもオブジェクトのサイズが2GBを超えることはありませんでしたが、大きな配列を使用する特定のワークロードでは、このサイズ制限が制約される可能性があります。 NET 4.5では、配列が2GBより大きくなるなど、64ビットプロセスで配列の制限を解除することができます。つまり、Int32.MaxValue Int32sの配列を割り当てることができます(このような配列は8GBを消費します)。 .NETのラージオブジェクトは、LOH(Large Object Heap)と同時には認識されない特別なヒープ上に割り当てられ、.NET 4.5ヒープ内の空きメモリを管理するためのより良いアルゴリズムの使用を含む、LOHに対する大幅なパフォーマンス改善も見られました。

http://msdn.microsoft.com/en-us/library/hh285054(v=VS.110).aspx

http://blogs.msdn.com/b/somasegar/archive/2012/05/16/net-improvements-for-cloud-and-server-applications.aspx

関連する問題