如何以编程方式获取进程使用的内存量? [复制]

Posted

技术标签:

【中文标题】如何以编程方式获取进程使用的内存量? [复制]【英文标题】:How to programmatically get amount of memory used by process? [duplicate] 【发布时间】:2013-11-17 03:36:57 【问题描述】:

我正在运行一些测试代码(我自己的),我希望它们自行报告它们使用了多少内存。理想情况下,这将是一个高水位线。类似于 Activity Monitor 或 top 报告的内容。

C++ 代码,需要在 OSX 和/或 Linux 上工作。一种对两者都适用的方法会很棒,如果不是对任何一种都适用的方法会受到欢迎。

OSX 程序如何知道它使用了多少内存?

【问题讨论】:

xcode 有很多分析工具,只需在菜单中进行分析或按 cmd I 如果要跟踪堆使用情况,一种方法是覆盖全局 new 和 delete 运算符,并让它们在调用时调整计数器的值。 (棘手的一点是让全局删除运算符将计数器向下调整正确的数量——您必须自己存储分配大小才能做到这一点,通常在用户可见的分配缓冲区之前的一些额外字节中) 如果您将自己的全局newdelete 一起破解,您还必须注意诸如碎片之类的事情,这可能会导致当前分配的字节数之间存在很大差异对象和进程使用的字节数/页数,这可能是更大的问题。 答案在How to determine CPU and memory consumption from inside a process? @bmargulies 这正是我正在寻找的。我认为这样的东西一定存在于某个地方,但这次我的 Google-fu 让我失望了。谢谢!是时候投票结束我自己的问题了:) 【参考方案1】:

我可能会研究 tcmalloc、jemalloc 或其他一些 malloc 替代品。 tcmalloc 提供了相当多的自省——http://gperftools.googlecode.com/svn/trunk/doc/tcmalloc.html 概述了它提供的功能。看看“Generic Tcmalloc Status”和“Memory Introspection”部分,如果你选择走这条路,这些想法可能会有所帮助。如果您想了解 jemalloc,请参阅 http://www.facebook.com/notes/facebook-engineering/scalable-memory-allocation-using-jemalloc/480222803919 。

除此之外,还有一些依赖于操作系统的机制来获取信息。在 linux 上,/proc/self/statm 应该有你想要的一切。 man proc 应该有关于文件的文档。

用于统计数据的 malloc 替代品可能比您自己实现的任何东西更易于使用、更便携且更全面。

【讨论】:

这些对于分析和调试都很有用,但不幸的是我的代码是基准,我不希望性能受到影响。这些可能在代码可以运行两次的情况下很有用,一次用于时间/CPU,一次用于内存使用。

以上是关于如何以编程方式获取进程使用的内存量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取正在侦听某个端口的进程的 pid?

如何获取系统上正在运行的进程列表并按各种参数对其进行排序

以编程方式获取另一个进程的父 pid?

如何使用 C++ 以编程方式杀死进程?

如何在同一台机器上以编程方式获取通过 AF_INET 套接字连接到我的代理的进程的 PID?

socket详解