Linux:如何测量应用程序或进程的实际内存使用情况? 当我在Linux中使用“top”来显示一个进程的内存时,我发现该进程的存储仅增加而不减少,除非我关闭所有进程。我不知道为什么,尽管我只在“malloc”后面使用“free”。如何获得我的进程的正确实时存储?谢谢大家。
查找进程的pid,如果该进程使用相同用户运行,则使用“ps aux”命令,否则使用“ps ax”命令,然后执行以下操作:
cat /proc/<PID>/status
根据您的分配大小,您的内存可能会或可能不会返回给操作系统。如果您正在分配大的东西(请参见malloc(3)
中的MMAP_THRESHOLD
),需要许多页面的内存,则glibc将使用mmap(2)
的MAP_ANONYMOUS
标志进行分配;当您释放此对象时,glibc可以将页面返回给操作系统,您的内存使用量将下降。
如果您有许多较小的分配,则您的内存可能会碎片化,以至于free(3)
实际上无法释放可以返回给操作系统的整个页面。您在给定页面上可能使用相对较少的内容,但整个页面仍针对您的进程进行分配,并替换其他进程的整个页面数据。
如果您希望,可以使用mallopt(3)
调整MMAP_THRESHOLD
。
你可以尝试使用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-- [ 匿名 ]
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
我认为其他问题并没有详细回答这个问题。
除了 sarnold所说的,在释放内存时,按照与malloc()
相反的顺序释放内存可能会有所帮助,特别是对于较小的内存块。然后堆可以从末尾再次缩小...
为了验证这一点,在测试程序中,您应该调用void *sbrk(intptr_t increment);
,增量为0 - 然后它告诉您堆的当前值 - 并输出它以查看其变化。如果您正确地按照正确的顺序执行,glib应该调用brk()
来增加堆,并最终再次缩小它。