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
时发生异常答案 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来配置。
后一个限制就是你在使用所有16GB的物理内存之前很好地点击OutOfMemoryException的原因。
答案 1 :(得分:0)
Int32.MaxValue是一个laaaarge编号,您正在创建节点的新实例。最有可能的是,这会占用您可用的内存量或操作系统允许进程拥有的内存量。