为什么Valgrind-Massif和TOPs内存消耗之间存在差异?
我想在linux ubuntu中测量一个程序的内存消耗。我比较了两种工具:Valgrind Massif和TOP。出于某种原因,即使当我使用“--pages-as-heap = yes”来显示所有内存时,我也得到了不同的结果。为什么Valgrind-Massif和TOPs内存消耗之间存在差异?
-
我编译以下代码:
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并未在此设置下测量堆叠。为什么会发生?
编辑:
我试图在发布模式下编译,但得到了同样的问题。 我编译如下代码:
#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;
}
,还是把4200KB与TOP,以及约6MB与地块。 予编译的代码用下面的命令:
g++ -O2 -Wall myprog.c -o myprog
此外,当我跑的程序予增加使用的堆栈大小: 的ulimit -s 20亿 并且当跑了地块程序我还增加了堆栈大小,所以我不会得到堆栈溢出。我仍然得到相同的结果。
它看起来像你试图剖析调试版本(这是完全没有意义的)。因为在发行版本中,这两个程序都只有一个虚拟主程序作为编译程序,因为它们没有副作用,所有计算都扔掉了。另外第二个程序会导致堆栈溢出,因为您正试图在堆栈上分配巨大的数组。
请参阅我上面的修改。 –
您编辑的示例根本不占用堆栈,因此不需要增加允许的堆栈大小使用。此外,top报告的内存消耗非常少,大约为4200字节(你可能在你的问题上犯了一个错字),我想它不包括valgrind考虑的映射可执行页面的大小。因此valgrind会报告更高的内存消耗。单独stdlib是〜5Mb,所以它是有道理的。 – VTT