运行以下内容可以显示进程的内存使用情况:
$ ps -C processname -o size
SIZE
3808
有没有办法在不执行ps
(或任何外部程序)或阅读/proc
的情况下检索此信息?
答案 0 :(得分:7)
在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 ()
返回页面大小,以字节为单位。
答案 1 :(得分:0)
您可以通过以下几种方法找到程序的内存使用情况:
ps
,top
或pmap
ps
捆绑到您的应用中并直接使用它(当然是open source!)/proc
系统(无论如何都是ps
所做的那样......)/proc
文件系统只是内核数据结构的一个视图,所以这已经为你完成了。前者从系统管理的角度来看都是教育性的,并且是现实生活中最好的选择,但最后一个要点可能是最有趣的。您可能想要阅读Valgrind或memprof的源代码以了解它是如何工作的,但实际上您需要做的是在应用程序和内核之间插入机制,并拦截任何内存分配请求。此外,当进程启动时,您需要使用预设值(如0xDEADBEEF)初始化其内存空间。然后,在完成该过程后,您可以读取内存空间并计算除预设值之外的单词的出现次数,从而估计内存使用情况。
当然,事情总是比看起来更复杂。共享库使用的内存怎么样?管?您的进程与另一个进程之间共享内存系统调用?分配但未使用的虚拟内存?数据缓冲到磁盘?除了“流程记忆”之外,还有很多电话要求,请参阅this post了解其他一些问题。