是什么导致“抛出类型'System.OutOfMemoryException'的异常。”这段代码?

时间:2013-01-23 07:49:50

标签: c# .net memory linked-list

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

         }

}

当系统内存达到16GB的3

时发生异常

2 个答案:

答案 0 :(得分:4)

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

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

后一个限制就是你在使用所有16​​GB的物理内存之前很好地点击OutOfMemoryException的原因。

答案 1 :(得分:0)

Int32.MaxValue是一个laaaarge编号,您正在创建节点的新实例。最有可能的是,这会占用您可用的内存量或操作系统允许进程拥有的内存量。