首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测量函数调用期间的最大内存使用量。

问测量函数调用期间的最大内存使用量。
EN

Stack Overflow用户
提问于 2019-01-21 10:09:12
回答 2查看 961关注 0票数 2

我有一个Linux/Mac C++库,它以函数调用的形式执行一系列步骤。我想测量每一步的最大内存使用量。

我对一些特别的解决方案不感兴趣,比如启动另一个线程来轮询内存使用情况,运行分析器等等。

到目前为止,我已经发现getrusage()存在于Mac和Linux上,并且确实返回最大内存使用量,但是在每次函数调用之后,似乎没有办法重置这个最大值。

有什么办法可以绕过这个限制吗?

编辑:为了清楚起见,我不想强占malloc()/free()并记录所有内容。我想要一个适合继续运行生产代码的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-21 10:20:25

我浏览了Linux源代码,发现了这。

代码语言:javascript
复制
        /*
         * 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。

票数 1
EN

Stack Overflow用户

发布于 2019-01-21 12:51:11

malloc和free调用不仅仅是sbrk和mmap系统调用的简单包装器。这使得getrusage返回与调用malloc和free不一致的内容。在考虑向系统返回任何内容之前,这些函数的任何重要实现都将管理流程本身内的自由列表。

程序调用free (或delete ),内存不会立即返回到操作系统(可能永远不会)。任务可以重用free-ed内存(如果它调用malloc ),但其他进程不能重用。这使得getrusage从操作系统的角度来看是正确的,而从程序的角度来看则不是正确的。

在Linux上,您可以使用mallinfo()

代码语言:javascript
复制
#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,它在注释中声明:

代码语言:javascript
复制
/*
 * 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.
 */

这看上去不太有希望,并:

代码语言:javascript
复制
#include <malloc/malloc.h>
#include <cinttypes>
std::size_t memsize()
{
    auto data = mstats();
    return data.bytes_used;
}

看上去不太好,根据我的实验。但这可能比什么都不做好,或者仅仅依靠getrusage。我认为你在OSX上运气不好,除非有人能纠正我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54287611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档