需要说明的是,这符合雷蒙德·陈所说的“如果你需要知道那么你正在做一些错误的事情”的类别。
64位代码运行的线程默认堆栈大小为4兆字节,32位代码为1兆字节。虽然Thread构造函数可以让您传递一个整数值到int.MaxValue,但在32位机器上永远无法获得那么大的值。堆栈必须适合虚拟内存地址空间中的可用空洞,这通常在进程生命周期早期的~600MB上限。随着您分配内存并破碎地址空间,它会迅速变小。
分配比默认值更多是完全不必要的。当您有一个极度递归的方法导致堆栈溢出时,您可能会考虑这样做。不要这样做,修复算法,因为当任务变得更大时,您仍将使其崩溃。
.NET允许您选择的最小堆栈为250 KB。如果传递的值较小,则会自动四舍五入。这是必要的,因为Jitter和垃圾收集器都需要堆栈空间才能完成工作。同样地,这样做应该是完全不必要的。如果您考虑这样做是因为有很多线程并且使用它们的堆栈消耗了所有虚拟内存,那么您有太多线程。 StackOverflowException是您可能遇到的最严重的运行时异常之一。进程死亡是立即且不可捕获的。
主线程的堆栈大小由EXE头中的选项确定。编译器没有更改它的选项,您必须使用editbin.exe /stack来修补.exe头。