为什么Valgrind-Massif和最高内存消耗之间会有不同的范围

Why is there differenece between Valgrind-Massif and TOPs memory consumption?

本文关键字:之间 范围 Valgrind-Massif 高内存 内存 为什么      更新时间:2023-10-16

我想测量Linux Ubuntu中程序的内存消耗。我比较了两个工具:valgrind massif和顶部。由于某种原因,即使我使用" - pages-as-heap = yes"显示所有内存。

  1. 我编译了以下代码:

    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; }
    

当程序处于延迟函数时,顶部命令显示了4200KB虚拟内存的消耗。Valgrind-Massif工具的消耗量为6340608B。哪一个是正确的?为什么有区别?

  1. 尽管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在此设置下没有测量堆栈。为什么会发生?

编辑:

我试图在发布模式下编译,但遇到了同样的问题。我编译了以下代码:

#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("%lun",i);
    return 0;
}

仍然获得4200kb的顶部,约为6MB,带有massif。我用以下命令编译了代码:

g++ -O2 -Wall myprog.c -o myprog

另外,当我运行程序时,我使用以下方式增加了堆栈大小:Ulimit -s 20000000当使用massIF运行程序时,我还增加了堆栈尺寸,因此我不会堆栈溢出。而且我仍然得到相同的结果。

看起来您正在尝试介绍调试构建(这完全毫无意义(。因为在发行中构建这两个程序都只会有一个虚拟主PROC作为编译器,因为它们没有副作用,因此将所有计算丢弃。第二个程序也会导致堆栈溢出,因为您正在尝试在堆栈上分配大量数组。