我想测量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。哪一个是正确的?为什么会有区别?
#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/