-1
class Node
{
    public Node next;
    public int data;

    public Node(int d)
    {
        this.data = d;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Node n1 = new Node(10);
        Node n2 = null;

        Node root = n1;

        int count = 1;

        while (count < Int32.MaxValue -1)
        {
            n2 = new Node(count); //Exception
            n1.next = n2;

            n1 = n2;
            count++;

         }

}

システム メモリが 16 GB の 3 に達すると、例外が発生します。

4

2 に答える 2

4

他のコメンターが言ったように、Int32.MaxValue は大きな数 (約 24 億) であり、各ノードには少なくとも 8 バイトのヘッダーが必要です。すべての .NET オブジェクトにはこれがあります。さらに、ノード参照用にさらに 4 つ、int 用にさらに 4 つが必要です。 (32 ビット システムでは、x64 では、これらの数値はそれぞれ 16、8、および 4 になります)。掛け算すると、このプログラムは Node オブジェクトだけに 36GB 程度のメモリを割り当てようとしていることを意味します。これは、16GB システムで実行できない理由を説明するのに十分です。

ただし、32 ビット Windows では、そこまで到達する前に、プロセスのアドレス空間で問題が発生します。(他の 32 ビット オペレーティング システムでも同様の問題が発生します。これは、大部分が基盤となるハードウェアのアーティファクトであるためです。) 32 ビット ウィンドウでは、各プロセスが 4 GB を取得し、そのうち 2 GB がカーネルで必要とされます。 、プロセス自体は2GBを取得します。OS 設定を 1GB カーネル、プロセス用に 3GB に変更することで、これを構成できます。

そして、この後者の制限により、物理 RAM の 16 GB をすべて使い切る前に OutOfMemoryException が発生します。

于 2013-01-23T08:26:50.050 に答える
0

Int32.MaxValue はラージ数であり、ノードにその数を掛けた新しいインスタンスを作成しています。ほとんどの場合、使用可能なメモリの量、または OS がプロセスに許可するメモリの量を圧倒します。

于 2013-01-23T07:54:56.853 に答える