CLR 强制实施的 1 MB 堆栈大小限制适用于线程或整个应用程序/进程



在阅读本文和这篇文章后,我运行了一个非常简单的C#程序,如下所示:

static void Main(string[] args)
{
    Thread t = new Thread(new ThreadStart(myFunc), 2097152);
    t.start();
}

Thread类的构造函数的第二个参数是要为线程分配的堆栈的大小(以字节为单位(。2097152的数字相当于 2 兆字节。但是我的程序仍然可以正常工作而没有任何错误?我的程序在为此线程分配堆栈空间(完整应用程序本身限制为 1 MB(时是否应该抛出错误,或者我错过了一些非常明显的东西。最初我认为这可能是编译器检查本身。

CLR 如何确保线程的堆栈分配大小,使其不会突破界限?

PS:我的应用程序是32位控制台应用程序

1MB 只是每个线程的默认堆栈大小,而不是整个应用程序的默认堆栈大小。每个线程都有自己的堆栈。在线程构造函数中指定不同的堆栈大小时,将覆盖该线程的默认值。

如果你想测试堆栈大小的限制,你需要调用一个递归函数,直到堆栈被填满并溢出(因此这个网站的名字(。简单地创建更多的线程只会创建更多的堆栈。

根据Microsoft文档,

"从 .NET Framework 4 开始,只有完全受信任的代码才能将 maxStackSize 设置为大于默认堆栈大小(1 MB(的值。如果在部分信任的情况下运行代码时为 maxStackSize 指定了较大的值,则会忽略 maxStackSize,并使用默认堆栈大小。不会引发任何异常。任何信任级别的代码都可以将 maxStackSize 设置为小于默认堆栈大小的值。

最新更新