我有一个Linux/Mac C++库,它以函数调用的形式执行一系列步骤。我想测量每一步的最大内存使用量。
我对一些特别的解决方案不感兴趣,比如启动另一个线程来轮询内存使用情况,运行分析器等等。
到目前为止,我已经发现getrusage()存在于Mac和Linux上,并且确实返回最大内存使用量,但是在每次函数调用之后,似乎没有办法重置这个最大值。
有什么办法可以绕过这个限制吗?
编辑:为了清楚起见,我不想强占malloc()/free()并记录所有内容。我想要一个适合继续运行生产代码的解决方案。
发布于 2019-01-21 10:20:25
我浏览了Linux源代码,发现了这。
/*
* Writing 5 to /proc/pid/clear_refs resets the peak
* resident set size to this mm's current rss value.
*/我还没试过,但看上去很有希望。
编辑:它是在此承诺中添加的
编辑2:我查看了MacOS内核源代码--对应的值存储在resident_max中。不幸的是,似乎没有重新设置它的功能。
编辑3:在Linux上,您可以使用malloc_info()获得分配的最大内存,但是似乎没有一种方法来重置它。它还依赖于您使用glibc。
发布于 2019-01-21 12:51:11
malloc和free调用不仅仅是sbrk和mmap系统调用的简单包装器。这使得getrusage返回与调用malloc和free不一致的内容。在考虑向系统返回任何内容之前,这些函数的任何重要实现都将管理流程本身内的自由列表。
程序调用free (或delete ),内存不会立即返回到操作系统(可能永远不会)。任务可以重用free-ed内存(如果它调用malloc ),但其他进程不能重用。这使得getrusage从操作系统的角度来看是正确的,而从程序的角度来看则不是正确的。
在Linux上,您可以使用mallinfo()
#include <malloc.h>
#include <cinttypes>
std::size_t memsize()
{
auto data = mallinfo();
return data.arena - data.fordblks + data.hblkhd;
}在这里,memsize()将返回从程序的角度分配的字节数。它考虑到各种分配技术,如sbrk和mmap,并将舍入和开销作为malloc() (和new)分配内存的一部分。
有了OSX,事情就不那么光明了。您可以查看苹果malloc()的源代码,特别是mstats,它在注释中声明:
/*
* A Glibc-like mstats() interface.
*
* Note that this interface really isn't very good, as it doesn't understand
* that we may have multiple allocators running at once. We just massage
* the result from malloc_zone_statistics in any case.
*/这看上去不太有希望,并:
#include <malloc/malloc.h>
#include <cinttypes>
std::size_t memsize()
{
auto data = mstats();
return data.bytes_used;
}看上去不太好,根据我的实验。但这可能比什么都不做好,或者仅仅依靠getrusage。我认为你在OSX上运气不好,除非有人能纠正我。
https://stackoverflow.com/questions/54287611
复制相似问题