如何在 Linux 中获取一个进程的内存 [重复]
Posted
技术标签:
【中文标题】如何在 Linux 中获取一个进程的内存 [重复]【英文标题】:How can I get the memory of one process in Linux [duplicate] 【发布时间】:2012-05-11 15:33:40 【问题描述】:可能重复:Linux: How to measure actual memory usage of an application or process?
为什么我在Linux中使用'top'来显示我对一个进程的内存,我知道进程的存储只会增加而不是减少,除非我关闭所有进程。我不知道为什么,虽然我仅在“malloc”后面使用“free”。 我怎样才能获得我的流程的正确实际实时存储? 谢谢大家。
【问题讨论】:
您想从您的程序中通过 C API 获取该进程的内存使用情况(可能是该进程或通过 shell 命令)? 我认为这应该是评论而不是答案 @Sam,是的,但是 sebif 距离能够发布 cmets 仅两点之遥... ... 现在,您可以将其重新发布为评论。 :) 我从 shell 命令 'top' 中得知,当我采取一些行动时,我的 C 进程正在占用越来越多的操作系统存储空间,并且我知道我已经“释放”了所有的“malloc” '。 【参考方案1】:简短的回答是,在现代操作系统上,这非常困难。
free()ed 的内存实际上并没有返回给操作系统 直到进程终止,如此多的分配周期 并逐渐释放更大的内存块将导致 成长的过程。 (via)
This question has been already answered in more detail on another SO thread.你可能会在那里找到答案。
【讨论】:
【参考方案2】:根据分配的大小,您的内存可能会或可能不会返回给操作系统。如果你正在分配 large 东西(参见 malloc(3)
中的 MMAP_THRESHOLD
),占用很多内存页的东西,glibc 将使用 mmap(2)
的 MAP_ANONYMOUS
标志进行分配;当你free(3)
这个对象时,glibc可以将页面返回给操作系统,你的内存使用会下降。
如果您愿意,可以使用mallopt(3)
调低MMAP_THRESHOLD
。
如果您有许多较小的分配,您的内存可能碎片化,free(3)
实际上无法释放可以返回给操作系统的整个页面。您可能在给定页面上使用相对较少,但整个页面仍然分配给您的进程,并且它替换了来自其他进程的整个页面的数据。
【讨论】:
【参考方案3】:找到pid,如果它以同一用户运行,则使用“ps aux”,否则使用“ps ax”,然后执行:
cat /proc/<PID>/status
这应该是你想知道的全部。
【讨论】:
【参考方案4】:我认为这个其他问题并没有真正详细回答这个问题。
添加到what sarnold says,以与malloc()
相反的顺序添加free()
可能会有所帮助-尤其是对于较小的内存块。然后堆可以从最后再次收缩...
为了验证这一点,您应该在测试程序中调用 void *sbrk(intptr_t increment);
,增量为 0 - 然后它会告诉您堆的当前值 - 并输出它以查看其更改。如果您以正确的方式正确执行此操作,则 glib 应调用 brk()
来增加堆并最终再次缩小它。
【讨论】:
【参考方案5】:你可以试试pmap和id进程:
1: init [3]
001c3000 100K r-x-- /lib/ld-2.5.so
001dc000 4K r-x-- /lib/ld-2.5.so
001dd000 4K rwx-- /lib/ld-2.5.so
001e0000 1256K r-x-- /lib/libc-2.5.so
0031a000 8K r-x-- /lib/libc-2.5.so
0031c000 4K rwx-- /lib/libc-2.5.so
0031d000 12K rwx-- [匿名]
0034b000 8K r-x-- /lib/libdl-2.5.so
0034d000 4K r-x-- /lib/libdl-2.5.so
0034e000 4K rwx-- /lib/libdl-2.5.so
006f2000 236K r-x-- /lib/libsepol.so.1
0072d000 4K rwx-- /lib/libsepol.so.1
0072e000 40K rwx-- [匿名]
0073a000 84K r-x-- /lib/libselinux.so.1
0074f000 8K rwx-- /lib/libselinux.so.1
00fff000 4K r-x-- [匿名]
08048000 32K r-x-- /sbin/init
08050000 4K rw--- /sbin/init
09c0f000 132K rw--- [匿名]
b7fed000 8K rw--- [匿名]
bfd87000 84K rw--- [堆栈]
总计 2040K
【讨论】:
以上是关于如何在 Linux 中获取一个进程的内存 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
linux应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、