-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++;

         }

}

当系统内存达到 3 of 16GB 时发生异常

4

2 回答 2

4

正如其他评论者所说,Int32.MaxValue 是一个很大的数字(大约 24 亿),每个 Node 至少需要 8 个字节的标头 - 所有 .NET 对象都有这个 - 再加上四个用于 Node 引用,再加上另外四个用于 int (在 32 位系统上;在 x64 上,这些数字分别变为 16、8 和 4)。相乘,这意味着这个程序试图在 Node 对象中分配类似 36GB 的内存,这足以解释为什么你不能在 16GB 系统上运行它。

然而,在 32 位 Windows 上,在您到达那一步之前,您将遇到进程地址空间的问题。(你会在其他 32 位操作系统上遇到类似的情况,因为它在很大程度上是底层硬件的产物。)在 32 位 Windows 上,每个进程获得 4GB,其中内核需要 2GB ,并且进程本身获得 2GB。您可以通过将操作系统设置更改为 1GB 内核,进程为 3GB 来配置它。

后一个限制就是为什么您在用完所有 16GB 物理 RAM 之前就遇到 OutOfMemoryException 的原因。

于 2013-01-23T08:26:50.050 回答
0

Int32.MaxValue 是一个大数字,您正在创建节点的新实例乘以该数字。这很可能会压倒您可用的内存量或操作系统允许进程拥有的内存量。

于 2013-01-23T07:54:56.853 回答