如何测量峰值内存使用情况?

如何测量峰值内存使用情况?

我有一个 C++ 程序。我想知道这个程序的内存使用峰值。我尝试使用memusageGNU C 库,但结果与 Windows 上的不一样。这是为什么?

这是我的测试程序:

#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <list>

int main()
{
return 0;
}

这是memusage显示已使用 72,704 字节的输出:

Memory usage summary: heap total: 72704, heap peak: 72704, stack peak: 0
         total calls   total memory   failed calls
 malloc|          1          72704              0
realloc|          0              0              0  (nomove:0, dec:0, free:0)
 calloc|          0              0              0
   free|          0              0

在 Windows 上,我看到输出为 0B。

答案1

GNU C 库和 GCC 的标准 C++ 库malloc在程序启动期间(在main运行之前)分配堆内存并调用;对于您的情况,出于以下目的:

  • 动态链接
  • vDSO 设置(Linux 上所有使用 GNU C 库的程序都会这样做)
  • 紧急异常处理预分配(这是分配内存,以便始终可以处理异常,即使没有更多内存可以分配)

前两个不会出现在memusage堆使用统计中,72,704 字节分配对应于 C++ 异常处理分配。另请参阅 Valgrind 的输出:

$ valgrind ./memtest
==822129== Memcheck, a memory error detector
==822129== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==822129== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==822129== Command: ./memtest
==822129== 
==822129== 
==822129== HEAP SUMMARY:
==822129==     in use at exit: 0 bytes in 0 blocks
==822129==   total heap usage: 1 allocs, 1 frees, 72,704 bytes allocated
==822129== 
==822129== All heap blocks were freed -- no leaks are possible
==822129== 
==822129== For lists of detected and suppressed errors, rerun with: -s
==822129== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

如果您想查看所有内存时间的总体内存使用情况,一个简单的工具是/usr/bin/time

$ /usr/bin/time ./memtest
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 3148maxresident)k
0inputs+0outputs (0major+117minor)pagefaults 0swaps

这表明该程序在峰值时使用了 3,148K 内存。 (使用/usr/bin/time而不是time- 后者将使用 shell 的内置功能,这可能不会显示此信息。)

我想象 C++ 程序在 Windows 上执行类似的操作,但内存占用可能会有所不同,并且可能不包括启动堆使用情况。

相关内容