【发布时间】:2021-09-17 20:59:45
【问题描述】:
我有一个 c 程序,比如a.out。我可以使用类似的工具吗:
- 疑问句:
>$ peak-memory ./a.out
Peak heap memory allocated: 12345678 Bytes
具体来说,这是在Linux系统中。
另一个类似的问题是我可以在我的源程序中插入一个片段代码,每次执行它都会报告当前的堆内存使用情况。喜欢:
2. 疑问句:
int main(){
int *a = (int*) malloc(12);
// some code...
print_heap_usage();
// other code...
}
我知道我可以使用包装器my_malloc 和my_free 函数来跟踪分配和释放到全局变量的内存。但是对于别人的源代码是不实用的,我可能需要修改它的很多源代码。而且我不能再使用new 和delete。
我搜索了stackoverflow,有一个相关的问题Get peak amount of memory used by a C program 但它询问了Windows系统并且并不特别关心堆内存使用情况。有些回答说要使用getrusage,我google了一下,发现它不能告诉堆使用情况。
【问题讨论】:
-
你确定你需要 malloc 堆吗?如果程序也使用
mmap分配内存怎么办?只知道峰值驻留集大小是否有用? -
是的,只是 malloc/free heap 和 new/delete heap。我不考虑
mmap。只是好奇,如果我考虑mmap,答案有什么不同。 -
一个问题是只询问通过
malloc/new分配的内存,另一个是询问所有动态分配的来源。原因是“最大驻留集大小”是对进程对系统影响的完整度量(并且最大 RSS - 共享大小对于理解可伸缩性很有用)。这些是针对所有进程收集的统计信息。 -
@Useless 我正在对我的程序进行内存分析。我想知道峰值堆内存使用情况,这样我就可以知道它是否可以在计算机上运行。我只是谷歌
RSS,并且怀疑我的计算机是否有最大4GB RAM,我的程序是否完全分配了4.5GB RAM(我不会使用mmap的东西),是否有一些交换空间可以用来制作程序运行,或者它只是在 malloc 上失败并退出。 -
如果你想知道它是否会在计算机上运行,你肯定需要知道使用的总内存吗?
标签: c memory-management heap-memory glibc