【发布时间】:2015-04-23 18:40:55
【问题描述】:
今天的 PC 拥有大量物理 RAM,但 C# 的堆栈大小对于 32 位进程只有 1 MB,对于 64 位进程只有 4 MB (Stack capacity in C#)。
为什么 CLR 中的堆栈大小仍然如此有限?
为什么它正好是 1 MB (4 MB)(而不是 2 MB 或 512 KB)?为什么决定使用这些金额?
我对该决定背后的考虑和原因感兴趣。
【问题讨论】:
-
64 位进程的默认堆栈大小为 4MB,32 位进程为 1MB。您可以通过更改其 PE 标头中的值来修改主线程堆栈大小。您还可以使用
Thread构造函数的右重载来指定堆栈大小。但是,这引出了一个问题,为什么需要更大的堆栈? -
谢谢,已编辑。 :) 问题不在于如何使用更大的堆栈大小,而是为什么决定堆栈大小为 1 MB (4 MB)。
-
因为默认情况下每个线程都会得到这个堆栈大小,而且大多数线程不需要那么多。我刚刚启动了我的电脑,系统当前运行了 1200 个线程。现在做数学;)
-
@LucasTrzesniewski 不仅如此,它还必须在记忆中具有传染性。请注意堆栈的大小越大,您的进程可以在其虚拟地址空间中创建的线程就越少。
-
不确定“确切”为 1 MB:在我的 Windows 8.1 上,.NET Core 3.1 控制台应用程序的默认堆栈大小为
1572864字节(使用 GetCurrentThreadStackLimits Win32 API 检索)。我能够在没有 StackOverflowException 的情况下stackalloc大约1500000字节。
标签: c# stack clr stack-size