测量静态,堆和堆栈内存?(C ,Linux -CentOS 7)



我想分别测量堆栈,堆和静态内存,因为我对每个人都有一些约束。

要测量我使用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/mapscat /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

  • 要测量堆栈,可以使用堆栈

它给了我我想要的所有统计数据

最新更新