我有一个 C++ 程序。我想知道这个程序的内存使用峰值。我尝试使用memusage
GNU 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 上执行类似的操作,但内存占用可能会有所不同,并且可能不包括启动堆使用情况。