【发布时间】:2014-10-17 18:14:47
【问题描述】:
如何在 Linux 系统上从 C++ 代码中获取总内存、已用内存、空闲内存?
【问题讨论】:
-
读取 /proc 中的伪文件。他们有一个手册页。
-
可能重复,具体取决于您需要系统范围的信息还是特定于进程的信息:How to get memory usage at run time in c++?
如何在 Linux 系统上从 C++ 代码中获取总内存、已用内存、空闲内存?
【问题讨论】:
通过valgrind 运行您的程序。对于名为foo 的程序,例如:
valgrind foo
它将在跟踪内存使用情况的工具中运行程序,并在程序终止后打印出该信息。
如果您由于某种原因没有安装valgrind,您应该能够在您的发行版的包存储库中找到它。
【讨论】:
正如Chris Stratton 所评论的,您可以-on Linux- 在/proc/ 中查询很多系统信息,因此请阅读proc(5);其中包含要按顺序读取的文本伪文件(有点像管道)。这些不是真正的磁盘文件,因此读取速度非常快。您需要在每次测量时打开和关闭它们。
在进程内部,您可以使用/proc/self/maps - 和/proc/self/smaps 在virtual memory 中查询它的address space;在该进程之外,对于 pid 1234 的另一个进程,使用 /proc/1234/maps 和 /proc/1234/smaps;您可以通过/proc/meminfo获取系统范围的内存信息
所以在终端中尝试以下命令:
cat /proc/meminfo
cat /proc/$$/maps
cat /proc/$$/smaps
cat /proc/self/maps
更多地了解他们可以给你什么。
请注意malloc 和free(由new 和delete 使用)经常使用诸如mmap(2) 之类的系统调用(从内核)请求空间,但之前管理的是free-d 内存到重用它,因此通常不要使用munmap 将内存释放回内核。阅读C memory management 上的维基页面。换句话说,used 堆在进程之外是不可访问的(因为一些 unused,但可以在将来重复使用malloc-s,内存仍然是mmap-ed) .另见mallinfo(3) 和malloc_stats(3)。
作为Justin Lardinois answered,使用valgrind检测内存泄漏。
Advanced Linux Programming 是一本好书。它有几个相关的章节。
【讨论】: