当前位置: 首页 > 知识库问答 >
问题:

为什么堆栈内存大小如此有限?

林劲
2023-03-14

在堆上分配内存时,唯一的限制是可用RAM(或虚拟内存)。它产生Gb的内存。

那么,为什么堆栈大小如此有限(大约1 Mb)?什么技术原因阻止您在堆栈上创建真正大的对象?

更新:我的意图可能不清楚,我不想在堆栈上分配巨大的对象,也不需要更大的堆栈。这个问题只是纯粹的好奇心!

共有3个答案

穆铭晨
2023-03-14

这只是默认大小。如果您需要更多,您可以获得更多-通常是通过告诉链接器分配额外的堆栈空间。

拥有大堆栈的缺点是,如果创建多个线程,则每个线程将需要一个堆栈。如果所有堆栈都分配多MB,但不使用它,那么空间将被浪费。

你必须为你的计划找到适当的平衡。

有些人,比如@BJovke,认为虚拟内存本质上是免费的。确实,不需要物理内存来支持所有虚拟内存。您必须至少能够向虚拟内存提供地址。

然而,在一台典型的32位PC上,虚拟内存的大小与物理内存的大小相同,因为我们只有32位用于任何地址,无论是虚拟地址还是非虚拟地址。

由于进程中的所有线程共享相同的地址空间,因此它们必须在它们之间划分地址空间。在操作系统参与进来之后,应用程序“只剩下”2-3 GB。这个大小是物理内存和虚拟内存的限制,因为没有更多的地址了。

邹麻雀
2023-03-14

目前还没有人提到的一个方面:

有限的堆栈大小是一种错误检测和遏制机制。

通常,C和C中堆栈的主要工作是跟踪调用堆栈和局部变量,如果堆栈越界,它几乎总是设计和/或应用程序行为中的错误。

如果允许堆栈任意增长,这些错误(如无限递归)将很晚才被捕获,只有在操作系统资源耗尽之后。可以通过对堆栈大小设置任意限制来防止这种情况。除了足够小以防止系统退化之外,实际大小并不重要。

宰父保臣
2023-03-14

我的直觉如下。堆栈不像堆那么容易管理。堆栈需要存储在连续的内存位置。这意味着您不能根据需要随机分配堆栈,但至少需要为此保留虚拟地址。保留的虚拟地址空间越大,可以创建的线程就越少。

例如,32位应用程序的虚拟地址空间通常为2GB。这意味着,如果堆栈大小为2MB(在pthreads中为默认值),那么最多可以创建1024个线程。对于web服务器等应用程序来说,这可能很小。将堆栈大小增加到100MB(即保留100MB,但不一定立即将100MB分配给堆栈)会将线程数量限制在20个左右,即使对于简单的GUI应用程序也是如此。

一个有趣的问题是,为什么我们在64位平台上仍然有这个限制。我不知道答案,但我假设人们已经习惯了一些“堆栈最佳实践”:小心在堆上分配巨大的对象,如果需要,手动增加堆栈大小。因此,没有人发现在64位平台上添加“巨大”的堆栈支持是有用的。

 类似资料:
  • 我知道如何使用-Xss为java线程设置堆栈大小,我们在产品中使用它。 但是当我们的应用程序中使用了很多线程,并且设置了-Xss(我们设置为512k我们的使用)。我们会遇到错误报告无法创建新的本机线程。它应该与堆栈大小有关,因为当我们设置-Xss256k时,错误消失了。 我的问题是对于1个线程,Xss设置堆栈大小,但是对于所有线程,堆栈大小如何<整个线程的总堆栈内存大小的限制是什么?我没有发现这样

  • 如果我逃跑 在铬33上,我得到 为什么?

  • 我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。

  • 嗨,我得到一个,同时将一些小数据发送到我的服务器以检查它是否与存储的数据相等。我寻找了一段时间,但没有解决我的问题的办法。 和我的错误消息: e.app.malcheme.wunderlist e/AndroidRuntime:致命异常:AsyncTask#1进程:de.app.malcheme.wunderlist,PID:16191 java.lang.runtimeException:在An

  • 问题内容: 我正在使用Ubuntu 11.04。如何找出进程的最大调用堆栈大小以及堆栈中每个帧的大小? 问题答案: 您可以使用查询最大进程和堆栈大小。堆栈框架没有固定的尺寸。它取决于每个帧需要多少本地数据(即本地变量)。 要在命令行上执行此操作,可以使用ulimit。 如果要为正在运行的进程读取这些值,我不知道执行此操作的任何工具,但是查询/ proc文件系统很容易:

  • 如果我运行此代码,我会收到错误RangeError:超出最大调用堆栈大小。但为什么呢?当我用9调用它时就发生了,斐波那契在这么小的数字下应该不是问题。