爲了記錄,這適合雷蒙德陳的「如果你需要知道,你做錯了什麼」類別。
運行64位代碼的線程的默認堆棧大小爲4兆字節,對於32位代碼爲1兆字節。雖然Thread構造函數允許您將整數值傳遞給int.MaxValue,但您永遠無法在32位機器上獲得該值。堆棧必須適合虛擬內存地址空間中的一個可用空洞,在過程生命週期的早期,這通常會以大約600 MB的速度達到頂點。在分配內存和分割地址空間時,會迅速變小。
分配超過默認值是非常不必要的。你可能會考慮這樣做,當你有一個沉重的遞歸方法吹堆棧。不要,修正這個算法,或者當這個工作變得越來越大時,你會把它吹掉。
.NET允許您選擇的最小堆棧是250 KB。如果你傳遞一個更小的值,它會默默地將它四捨五入。必要的,因爲抖動和垃圾收集器都需要堆棧空間來完成他們的工作。再次,這樣做應該是不必要的。如果你考慮這麼做是因爲你有很多線程並且使用它們的堆棧消耗了所有的虛擬內存,那麼你有太多的線程。 StackOverflowException是您可以獲得的最差的運行時異常之一。程序死亡是直接的和不可接受的。
主線程的堆棧大小由EXE頭中的選項決定。編譯器沒有改變它的選項,你必須使用editbin.exe/stack來修補.exe頭文件。
[推動Windows的限制:進程和線程](http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx)可能很有趣。但它並不直接回答這個問題。 – 2011-03-31 23:27:45
確實很有意思。感謝分享。 – Oved 2011-04-01 00:08:39