是啥限制了我在内存方面对堆栈的使用?

Posted

技术标签:

【中文标题】是啥限制了我在内存方面对堆栈的使用?【英文标题】:What limits my use of the stack in terms of memory?是什么限制了我在内存方面对堆栈的使用? 【发布时间】:2010-12-12 06:02:13 【问题描述】:

在 Windows(或任何其他操作系统)中,是什么决定了我可以使用多少堆栈?这个网站的名称让我认为它可能会用完堆栈,所以我应该避免将大量数据放在堆栈上吗?

【问题讨论】:

【参考方案1】:

在 Win32 上默认堆栈大小为 1MB,可以在调用 CreateThread() 时和编译器设置中进行调整。

【讨论】:

【参考方案2】:

它是特定于语言、编译器和可能特定于操作系统的,但您应该将大量数据放在堆上而不是堆栈上。

Other SO post about this

有一些方法可以改变堆栈大小 - 但我不会搞砸它!

如果您想通过反复试验来了解您的堆栈大小 - 只需在堆栈上创建一个数组,看看它可以让您多少...

【讨论】:

【参考方案3】:

它完全是特定于操作系统且可配置的,在 linux 上,您可以通过 shell 中的 ulimit 调用来检查和更改。

取决于你所说的大,我目前的 Debians 标准堆栈大小是 8 megs,这足以容纳例如 1Meg 的大型数组。

【讨论】:

【参考方案4】:

您可以在 Visual Studio 中为您的应用程序设置堆栈大小

Project->Properties->Linker->System

虽然不推荐一种编程技术,但检索可用堆栈空间量相当简单:

CONTEXT                       Context;
memset(&Context, 0, sizeof(Context));
RtlCaptureContext(&Context);

long stackFree = Context.Rsp;

【讨论】:

【参考方案5】:

在 Windows 上,对于 Visual Studio 中的本机 C/C++ 项目,初始/主线程的堆栈大小使用链接器的 /STACK 选项(IDE 项目属性中的“链接器/系统/堆栈保留大小”)设置, 默认为 1MB。这也是未指定更具体内容的新线程的默认线程堆栈大小。

对于随后生成的线程,_beginthread()_beginthreadex()CreateThread() 都有一个参数可以让您指定线程的堆栈大小,如果您传入零,它将默认为您在链接器属性中设置的值.

详情请见http://msdn.microsoft.com/en-us/library/ms686774.aspx。

【讨论】:

【参考方案6】:

操作系统会设置一个上限,但您可以使用 链接器 设置一个特定的限制,它通常有一个特定的默认值,通常远低于操作系统允许的值。

【讨论】:

以上是关于是啥限制了我在内存方面对堆栈的使用?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver2008占内存高,一般是啥原因

如何知道是啥触发了我的 Flutter 小部件重建

堆栈内存有限制吗?

是啥限制了我的 ASP.NET 应用程序可以与 Web 服务建立的同时连接数?

JavaScript 内存限制

动态内存分配php