现代计算机的堆栈和堆空间

Posted

技术标签:

【中文标题】现代计算机的堆栈和堆空间【英文标题】:Stack and Heap Space for Modern Computers 【发布时间】:2011-04-17 03:47:54 【问题描述】:

在用 C 语言编写时,我如何知道启动程序时内存中有多少可用的堆栈空间?堆空间呢?

我如何知道在我的程序执行期间使用了多少内存?

【问题讨论】:

这里有一些关于 Windows 系统中堆栈大小的信息msdn.microsoft.com/en-us/library/ms686774%28VS.85%29.aspx 【参考方案1】:

这都是 Win32 特有的(不是真正的 C 特有的,只是 OS API):

当一个线程被创建时,它默认获得 1MB 的堆栈空间,可以在你使用的任何 CreateThread API 中进行修改。

您可以查看线程信息块以找到实际的堆栈信息,但即使有文档记录,该技术也不受官方支持,请参阅http://en.wikipedia.org/wiki/Win32_Thread_Information_Block。

此外,对于 32 位应用程序,您最多只能寻址 2GB,因此对于设计使用大量内存的应用程序,需要注意的是进程的虚拟地址空间的总大小(已提交 + 保留),其中包括所有堆分配。您可以使用 GlobalMemoryStatusEx API 以编程方式访问进程的虚拟内存,查看虚拟地址空间的ullTotalVirtual 参数。一旦您的进程接近 1.8 或 1.9GB 的 VAS,堆分配和 VirtualAlloc 调用就会开始失败。对于“普通”应用程序,您不必担心 VAS 用完,但检查失败分配总是好的。此外,除非您有错误或糟糕的设计,否则不应出现堆栈溢出。

【讨论】:

这很有帮助,谢谢。它给了我一个起点。【参考方案2】:

有一种哲学认为,当您出于实际而非教育或信息的原因而需要提出这类问题时,那么您就做错了。

如果您要求它进行错误检查或确保您的程序有足够的内存,等等......那么不要担心它,认真的。至于您的程序内存,如果仅用于调试,您可以使用任务管理器(在 Windows 上)。如果你需要在你的程序中知道这一点,我不会指望任何非 hacky 的解决方案。

【讨论】:

哈,谢谢你的回答。这纯粹是出于教育原因。我编写了很多 C 程序,但对内存空间成本/使用情况有一个模糊的概念,但想知道专业开发人员如何具体了解他们的程序如何影响系统。 另一种哲学是,如果你的程序需要内存,它应该简单地尝试分配它并准备好处理失败。明智地分配什么总是好的做法。除非您被要求分配的内存量不能超过 x 量,否则它对系统其余部分的影响实际上是一个系统工程问题。另外,不要假设这个数字是固定的。您的程序可能在操作系统上运行,该操作系统旨在在较高优先级的进程达到上限时终止较低优先级的进程以释放内存。【参考方案3】:

抽象是有原因的 真的,你的程序不应该有这个问题。这是操作系统的问题,您的问题应该是有效地满足它的需要,并让操作系统完成它的工作。

如果您坚持,您可以查看/proc/meminfobrk()getrlimit()setrlimit() (here are some docs) 以及RLIMIT_STACKRLIMIT_DATA 的近似值和粗糙度值。

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main (int argc, char *argv[])

  struct rlimit limit;

  /* Get the stack limit. */
  if (getrlimit(RLIMIT_STACK, &limit) != 0) 
    printf("getrlimit() failed with errno=%d\n", errno);
    exit(1);
  

  printf("The stack soft limit is %llu\n", limit.rlim_cur);
  printf("The stack hard limit is %llu\n", limit.rlim_max);
  exit(0);

从here 修改,另请参阅您系统上的man getrlimit

如果你说明什么为什么你想这样做,有人可能有更好的方法或方式来做你想做的事。

【讨论】:

以上是关于现代计算机的堆栈和堆空间的主要内容,如果未能解决你的问题,请参考以下文章

两种语言是不是在 ram 上使用相同的堆栈和堆?

(基础篇)浅析JAVA中的栈和堆

数据结构的栈和堆和程序中的堆和栈

堆栈与堆栈和堆与堆

js——堆栈

单片机中栈和堆的区别是啥?