CLR强制执行的1 MB堆栈大小限制是针对一个线程还是整个应用程序/进程?

时间:2017-02-06 03:17:43

标签: c# .net memory-management stack clr

阅读thisthis后,我运行了一个非常简单的C#程序,如下所示:

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

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

CLR如何确保线程的堆栈分配大小,以便它不会破坏边界?

P.S。 :我的应用程序是32位控制台应用程序

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

As per Microsoft documentation

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