如何在 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应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、

linux下如何获取某一进程占用的物理内存和虚拟内存

linux 共享内存 可不可以不加锁呢? 系统有两个进程,一个负责写入,一个负责读取

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

给定用户计算他们的进程消耗了多少字节[重复]

当进程使用 shm_open() 时,Linux 内核如何分配内存指针?