可能重复:
Linux: How to measure actual memory usage of an application or process?
为什么我在Linux中使用'top'来显示我对一个进程的记忆,我得知进程的存储只会增加并且不会减少,除非我关闭所有进程。我不知道为什么,尽管我在'malloc'后面使用'free'。 如何获得正确的实时实时存储? 谢谢大家。
答案 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 says,free()
可能与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