可以通过运行显示进程的内存使用情况:
$ ps -C processname -o size
SIZE
3808
有没有办法在不执行ps
(或任何外部程序)或阅读的情况下检索这些信息/proc
?
可以通过运行显示进程的内存使用情况:
$ ps -C processname -o size
SIZE
3808
有没有办法在不执行ps
(或任何外部程序)或阅读的情况下检索这些信息/proc
?
在Linux系统上,可以通过读取查询进程的内存使用情况/proc/[pid]/statm
。[pid]
进程的PID在哪里。如果一个进程想要查询它自己的数据,它可以通过读取/proc/self/statm
来实现。man 5 proc
说:
/proc/[pid]/statm
Provides information about memory usage, measured in pages. The columns are: size total program size (same as VmSize in /proc/[pid]/status) resident resident set size (same as VmRSS in /proc/[pid]/status) share shared pages (from shared mappings) text text (code) lib library (unused in Linux 2.6) data data + stack dt dirty pages (unused in Linux 2.6)
您可以使用:打开文件fopen("/proc/self/statm", "r")
并读取内容。
由于文件以“页面”返回结果,因此您还需要查找页面大小。getpagesize ()
返回页面的大小,以字节为单位。
您有几个选项可以查找程序的内存使用情况:
ps
, top
, 或者pmap
像你从命令行一样ps
到您的应用程序中并直接使用它(它是开源的,当然!)/proc
系统(ps
反正就是这样……)/proc
一个视图,所以这实际上已经为您完成了。从系统管理的角度来看,前者都是教育性的,并且是现实生活中的最佳选择,但最后一个要点可能是最有趣的。您可能想阅读 Valgrind 或 memprof 的源代码以了解它是如何工作的,但本质上您需要做的是在应用程序和内核之间插入您的机制,并拦截任何内存分配请求。此外,当进程启动时,您可能希望使用预设值(如 0xDEADBEEF)初始化其内存空间。然后,在该过程完成后,您可以读取内存空间并计算预设值以外的单词的出现次数,从而估算出内存使用情况。
当然,事情总是比看起来更复杂。共享库使用的内存呢?管道?您的进程和另一个进程之间的共享内存?系统调用?已分配但未使用的虚拟内存?缓冲到磁盘的数据?除了您的问题“过程记忆”之外,还有很多电话需要拨打,请参阅这篇文章了解其他一些问题。