如何确定Linux程序的当前堆栈大小?
据说Linux每个程序的堆栈大小为8 MB,但是当您使用cat /proc//mmap时会显示不同的大小。
另外,如何确定关联线程的堆栈大小?因为据说线程有自己的私有堆栈。
如何确定Linux程序的当前堆栈大小?
据说Linux每个程序的堆栈大小为8 MB,但是当您使用cat /proc//mmap时会显示不同的大小。
另外,如何确定关联线程的堆栈大小?因为据说线程有自己的私有堆栈。
如果您只想知道当前堆栈大小,可以在main()函数的顶部声明一个变量,获取其地址,并将其与在定义“current”时声明的变量的地址进行比较。差异应该是堆栈增长的大致大小。
如果您想知道为堆栈保留了多少内存,则可以检查/proc/[pid]/maps,其中有一个标记为[stack]的区域。例如,我的atd进程具有:
7fff72a41000-7fff72a56000 rw-p 00000000 00:00 0 [stack]
0175b000-0177c000 rw-p 00000000 00:00 0 [heap]
这个小技巧可以帮助你了解程序使用的最大堆栈大小。
一位朋友向我分享了一个小技巧,当我想知道我的程序使用的最大堆栈大小时,可以采用以下方法。我在这里介绍一下,以防有人觉得有用 :)
1)在main()函数开始附近的一个函数中,使用alloca()或一个很长的数组,在你预计可能使用的堆栈上刻上0xDEADBEEF或其他类似不太可能出现的常量。这段内存将在小函数返回时被“释放”。
2)在main的末尾再次使用alloca()来获取一块内存区域,并“搜索”其中包含你之前刻上的魔法常量的位置(你可以尝试找到其中的前64个来跳过已分配但从未使用的内存区域),指针停留的位置即表示你的最大堆栈使用量。
虽然不完美,但对我当时做的事情很有用!
正如Steven所建议的那样,你的线程保留的堆栈大小和线程当前使用的堆栈之间存在差异。
如果你想知道一个线程为多少内存保留,可以使用pthread属性。
pthread_attr_t attr;
size_t stacksize;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("%u\n", stacksize);
虽然有多种方法可以手动查询Linux中的这些信息,例如在/proc/
等地方。但我最近发现stackusage非常方便,它拦截线程的创建并显示实际使用情况,非常准确。对于单线程应用程序也适用。