用C语言编写时,如何在启动程序时判断内存中可用的堆栈空间是多少?堆空间怎么样?
如何判断程序执行期间使用了多少内存?
答案 0 :(得分:2)
有一种哲学认为,当你需要提出这些问题时,出于实际而非教育或信息的原因,那么你就是在做一些严重的错误。
如果您要求进行错误检查或确保您的程序有足够的内存,请等等......请不要对此感到担忧,请认真对待。至于您的程序内存,如果只是用于调试,您可以使用任务管理器(在Windows上)。如果你需要在你的程序中知道这一点,我不会指望任何非hacky解决方案。
答案 1 :(得分:2)
这是所有特定于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 :(得分:1)
抽象原因 实际上,您的程序不应该将此作为一个问题。这是一个操作系统问题,你的问题应该只是有效率,并让操作系统完成它的工作。
如果您坚持,可以使用/proc/meminfo
和{brk()
来查看getrlimit()
,setrlimit()
,RLIMIT_STACK
和RLIMIT_DATA
(here are some docs) {1}}近似值和粗糙值的值。
#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
如果您说明 ,那么有人可能会采用更好的方法或方法来做您想做的事。