我想分别测量堆栈,堆和静态内存,因为我对每个人都有一些约束。
要测量我使用valgrind-> massif工具的堆内存。MassIF也应该可以测量堆和堆叠内存,但显示出奇怪的结果:
-
最后的快照没有-stacks = yes提供total(b(= 0,有用的heap(b(= 0,额外heap(b(= 0(所以一切都很好(
-
最后一个带有-stacks = yes的快照= yes total(b(= 2,256,有用的heap(b(= 1,040,超高(b(= 0,stacks(b(= 1,208(显示内存显示内存泄漏即使是同一命令和同一二进制测试... dunno为什么...(
所以最后我需要一个工具来测量C 二进制使用的堆栈和静态内存,欢迎一些帮助:(
感谢您的帮助!
态进一步访问了Basile Starynkevitch评论,以解释我从dmalloc库文档中获取的静态,堆栈和堆内存的意思:
静态数据是将其存储空间编译到程序中的信息。
/* global variables are allocated as static data */ int numbers[10]; main() { … }
堆栈数据是在运行时分配的数据,以保存功能中使用的信息。此数据由系统在称为堆栈空间的空间中管理。
void foo() { /* if they are, the parameters of the function are stored in the stack */ /* this local variable is stored on the stack */ float total; … } main() { foo(); }
HEAP数据也在运行时分配,并为程序员提供动态内存功能。
main() { /* the address is stored on the stack */ char * string; … /* * Allocate a string of 10 bytes on the heap. Store the * address in string which is on the stack. */ string = (char *)malloc(10); … /* de-allocate the heap memory now that we're done with it */ (void)free(string); … }
我想分别测量堆栈,堆和静态内存,因为我对每一个都有一些约束。
我无法想象为什么您对每个人都有分开的约束。他们都坐在虚拟内存中!顺便说一句,您可以使用setRlimit(2(设置限制(也许是从调用外壳过程中,例如使用bash ulimit
内置(。
如果您考虑过程的实际虚拟地址空间,则您的定义很幼稚。
btw,Proc(5(使您可以查询该空间,例如在程序内部使用/proc/self/maps
(或/proc/1234/maps
(查询PID 1234的过程,也许是从终端查询(。您也可以使用/proc/self/status
和/proc/self/statm
(BTW在终端中尝试cat /proc/self/maps
和cat /proc/$$/maps
(。在Linux上,您还可以使用Mallinfo(3(和Malloc_stats(3(获取有关内存分配统计信息的信息。
静态数据可能在您程序的数据段(或BSS段(中。但是线程本地空间呢?这些数据段还包含了各个库内部的数据,尤其是C标准库libc.so
(是否计算?(。当然,堆栈段通常比实际使用的堆栈(从"底部"到当前%esp
寄存器(更大(由于页面对齐(。一个多线程过程具有堆栈(和堆栈段(,每个线程一个。
堆栈数据当然是在呼叫堆栈中,其中包含许多其他内容(返回地址,差距,溢出寄存器(,而不仅仅是自动变量(其中一些仅位于寄存器中或由编译器进行优化,而无需消费任何堆栈插槽(。他们数数吗?另外,来自CRT0的启动代码(调用您的main
(可能会使用一点堆栈空间(它计算吗?(...
堆分配的数据(可以从各个库中分配,甚至从动态链接器中分配(不仅包含您的程序从malloc
(和朋友(获得的内容,还包含必要的开销。这很重要吗?那内存映射的文件呢?他们应该如何计数?
我建议查询实际的虚拟地址空间(例如,通过读取/proc/self/maps
或使用PMAP(1(...(,但是您会得到与您提出的不同的东西。
只是顺便说一句,我在您的回答之前找到了它:
-
测量堆内存使用valgrind-> massif
-
测量静态内存使用bash函数
size
-
要测量堆栈,可以使用堆栈
它给了我我想要的所有统计数据