为什么我在Linux中使用'top'来显示我对一个进程的内存,我知道进程的存储只会增加并且不会减少,除非我关闭所有进程。我不知道为什么,虽然我使用'free ' 仅在 'malloc' 之后。我怎样才能获得我的流程的正确实际实时存储?谢谢大家。
5 回答
找到pid,如果它以同一用户身份运行,则使用“ps aux”,否则使用“ps ax”,然后执行以下命令:
cat /proc/<PID>/status
这应该是你想知道的。
简短的回答是,在现代操作系统上,这非常困难。
在进程终止之前,free()ed 的内存实际上不会返回给操作系统,因此分配和释放越来越大的内存块的许多循环将导致进程增长。(通过)
这个问题已经在另一个 SO 线程上得到了更详细的回答。你可能会在那里找到答案。
根据分配的大小,您的内存可能会或可能不会返回给操作系统。如果您要分配大的东西(参见MMAP_THRESHOLD
参考资料malloc(3)
),占用许多内存页的东西,glibc 将使用mmap(2)
'MAP_ANONYMOUS
标志进行分配;当你使用free(3)
这个对象时,glibc 可以将页面返回给操作系统,你的内存使用量就会下降。
如果你愿意,你可以MMAP_THRESHOLD
调低使用。mallopt(3)
如果您有许多较小的分配,您的内存可能会碎片化,free(3)
实际上无法释放可以返回给操作系统的整个页面。您可能在给定页面上使用的资源相对较少,但整个页面仍然分配给您的进程,并且它替换了来自其他进程的整个页面的数据价值。
我认为这个其他问题并没有真正详细回答这个问题。
添加到sarnold 所说free()
的内容中,以相反的顺序可能会有所帮助malloc()
- 特别是对于较小的内存块。然后堆可以从最后再次收缩......
为了验证这一点,您应该在测试程序中void *sbrk(intptr_t increment);
以 0 的增量调用 - 然后它会告诉您堆的当前值 - 并输出它以查看其更改。如果你以正确的方式正确地执行此操作,glib 应该调用brk()
以增加堆并最终再次缩小它。
您可以尝试 pmap 和 id 进程:
1: init [3]
001c3000 100K rx-- /lib/ld-2.5.so
001dc000 4K rx-- /lib/ld-2.5.so
001dd000 4K rwx-- /lib/ld-2.5.so
001e0000 1256K rx--/lib/libc-2.5.so
0031a000 8K rx--/lib/libc-2.5.so
0031c000 4K rwx-- /lib/libc-2.5.so
0031d000 12K rwx-- [匿名]
0034b000 8K rx--/lib/libdl-2.5.so
0034d000 4K rx--/lib/libdl-2.5.so
0034e000 4K rwx-- /lib/libdl-2.5.so
006f2000 236K rx--/lib/libsepol.so.1
0072d000 4K rwx-- /lib/libsepol.so.1
0072e000 40K rwx-- [匿名]
0073a000 84K rx-- /lib/libselinux.so.1
0074f000 8K rwx-- /lib/libselinux.so.1
00fff000 4K 接收-- [匿名]
08048000 32K rx--/sbin/init
08050000 4K rw--- /sbin/init
09c0f000 132K rw--- [匿名]
b7fed000 8K rw--- [匿名]
bfd87000 84K rw--- [堆栈]
总计 2040K