我想测量linux ubuntu中一个程序的内存消耗。我比较了两个工具:Valgrind Massif和TOP。由于某些原因,即使使用“--pages-as-heap = yes”显示所有内存,我也得到了不同的结果。

  • 我编译了以下代码:
    void delay(double secs)
    {
        int i,j;
        for(j=0;j<5000*secs;j++)
            for(i=0;i<99999;i++);
    }
    int main() {
        delay(30);
    return 0; }
    

  • 当程序处于延迟功能时,TOP命令显示虚拟内存消耗4200KB。 Valgrind-Massif工具消耗了6340608B。哪一个是正确的?为什么会有区别?
  • 尽管Massif网站告诉我们,启用了“--pages-as-heap = yes”选项也可以测量堆栈,但是我没有成功。例如,对于以下程序:
    #include <stdlib.h>
    void delay(double secs)
    {
        int i,j;
        for(j=0;j<5000*secs;j++)
            for(i=0;i<99999;i++);
    }
    void func(int n)
    {
       char x[2000000];
       int i;
       if(n==0)
       return;
       for(i=0;i<2000000;i++)
           x[i]=(char)n;
       delay(15);   // Delay number 2,3,4,5
       func(n-1);
       return;
    }
    int main() {
       delay(30);   // Delay number 1
       func(4);
       delay(30);   // Delay number 6
       return 0;}
    

  • TOP报告的内存消耗为:4200 KB,然后是6032KB,然后是7984 KB,然后是9936 KB,然后是11892 KB,然后是13844 KB。但是,Massif在程序开始时只报告了6336512 B(实际上,内存中有一些波动,但是波动非常快,并且不是很大)。似乎由于某种原因,Massif无法在此设置下测量堆栈。为什么会这样呢?

    编辑:

    我试图在 Release模式下进行编译,但是遇到了同样的问题。
    我编译了以下代码:
    #include<stdio.h>
    #include <stdlib.h>
    unsigned long delay(double secs)
    {   long i,j,k,counter=0;
        for(k=0;k<160000;k++)
        for(j=0;j<5000*secs;j++)
            for(i=0;i<99999;i++)
                counter++;
        return counter;
    }
    int main()
    {
        unsigned long i;
        i=delay(10);
        printf("%lu\n",i);
        return 0;
    }
    

    TOP仍然有4200KB,而Massif大约有6MB。
    我使用以下命令编译了代码:
    g++ -O2 -Wall myprog.c -o myprog
    

    另外,当我运行程序时,我使用以下方法增加了堆栈大小:
    ulimit -s 2000000000
    并且在使用Massif运行程序时,我还增加了堆栈大小,因此不会出现堆栈溢出问题。而且我仍然得到相同的结果。

    最佳答案

    看来您正在尝试分析调试版本(完全没有意义)。因为在发行版中,这两个程序都只有一个虚拟主进程作为编译器,并且由于没有副作用,因此将丢弃所有计算。另外,第二个程序也会导致堆栈溢出,因为您正在尝试在堆栈上分配巨大的数组。

    关于c++ - 为什么Valgrind-Massif和TOP的内存消耗有区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43591402/

    10-14 17:10