如何在Linux中获取一个进程的内存

时间:2012-05-02 06:52:24

标签: linux unix

  

可能重复:
  Linux: How to measure actual memory usage of an application or process?

为什么我在Linux中使用'top'来显示我对一个进程的记忆,我得知进程的存储只会增加并且不会减少,除非我关闭所有进程。我不知道为什么,尽管我在'malloc'后面使用'free'。 如何获得正确的实时实时存储? 谢谢大家。

5 个答案:

答案 0 :(得分:8)

找到pid,如果它作为同一个用户运行,则使用“ps aux”,否则使用“ps ax”,然后执行:

cat /proc/<PID>/status

这应该是你想知道的全部。

答案 1 :(得分:5)

简短的回答是,在现代操作系统上,这非常困难。

free()ed的内存实际上并没有返回给操作系统 直到进程终止,这么多的分配周期 并逐渐释放更大的内存块 成长的过程。 (via

This question has been already answered in more detail on another SO thread.你可能会在那里找到答案。

答案 2 :(得分:1)

根据您的分配大小,您的内存可能会也可能不会返回到操作系统。如果您要分配大型内容(请参阅MMAP_THRESHOLD中的malloc(3)),那么需要多页内存的内容,glibc将使用mmap(2)的{​​{1}标志用于分配;当你MAP_ANONYMOUS这个对象时,glibc可以将页面返回给操作系统,你的内存使用率会下降。

如果您愿意,可以使用free(3)调低MMAP_THRESHOLD

如果您有许多较小的分配,您的内存可能碎片足以使mallopt(3)无法实际释放可能返回给操作系统的整个页面。您在给定页面上的 use 可能相对较少,但整个页面仍然是针对您的流程分配的,它会从其他流程中替换整个页面的数据。

答案 3 :(得分:0)

我不认为这个其他问题真的能够详细解答这个问题。

添加到what sarnold saysfree()可能与malloc()的顺序相反 - 特别是对于较小的内存块。然后堆可以从末尾再次收缩......

为了验证这一点,您应该在测试程序中以增量0调用void *sbrk(intptr_t increment); - 然后它会告诉您堆的当前值 - 并输出它以查看其更改。如果你正确地并且在正确的oder中执行它,glib应该调用brk()来增加堆并最终再次收缩它。

答案 4 :(得分:0)

您可以尝试使用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-- [anon]

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-- [anon]

0073a000 84K r-x-- /lib/libselinux.so.1

0074f000 8K rwx-- /lib/libselinux.so.1

00fff000 4K r-x-- [anon]

08048000 32K r-x-- / sbin / init

08050000 4K rw --- / sbin / init

09c0f000 132K rw --- [anon]

b7fed000 8K rw --- [anon]

bfd87000 84K rw --- [stack]

总计2040K