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 个时,会发生异常
正如其他评论者所说,Int32.MaxValue 是一个很大的数字(大约 24 亿),每个节点至少需要 8 个字节的标头 - 所有 .NET 对象都有这个 - 加上四个用于节点引用,另外四个用于 int(在 32 位系统上;在 x64 上,这些数字分别变为 16、8 和 4)。乘以,这意味着该程序试图仅在 Node 对象中分配 36GB 的内存,这足以解释为什么你不能在 16GB 的系统上运行它。
但是,在 32 位 Windows 上,在您走得那么远之前,您会遇到进程地址空间的问题。 (您会遇到与其他 32 位操作系统类似的操作系统,因为它在很大程度上是底层硬件的工件。 在 32 位窗口上,每个进程获得 4GB,其中内核需要 2GB,进程本身获得 2GB。 您可以通过将操作系统设置更改为 1GB 内核,3GB 进行配置。
后一种限制就是为什么您在用完所有 16GB 物理 RAM 之前点击 OutOfMemoryException 的原因。
Int32.MaxValue 是一个 laaaarge 数字,您正在创建 Node 乘以该数字的新实例。这很可能使可用的内存量或操作系统允许的进程拥有的内存量不堪重负。