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

7
可能有重复:
Linux:如何测量应用程序或进程的实际内存使用情况? 当我在Linux中使用“top”来显示一个进程的内存时,我发现该进程的存储仅增加而不减少,除非我关闭所有进程。我不知道为什么,尽管我只在“malloc”后面使用“free”。如何获得我的进程的正确实时存储?谢谢大家。

你想通过C API从程序内部获取该进程的内存使用情况,还是通过shell命令获取? - Dan D.
这应该是一个注释,而不是答案。 - Sam Holder
@Sam,是的,但sebif只差两个点就能够发布评论了... - sarnold
现在,你已经足够可以将此作为评论重新发布了。 :) - sarnold
我从shell命令“top”中得知,当我执行某些操作时,我的C进程正在占用越来越多的操作系统存储空间,而我知道我已经“free”了所有的“malloc”。 - keyoflov
5个回答

8

查找进程的pid,如果该进程使用相同用户运行,则使用“ps aux”命令,否则使用“ps ax”命令,然后执行以下操作:

cat /proc/<PID>/status

这应该是你想了解的全部内容。

6

1

根据您的分配大小,您的内存可能会或可能不会返回给操作系统。如果您正在分配的东西(请参见malloc(3)中的MMAP_THRESHOLD),需要许多页面的内存,则glibc将使用mmap(2)MAP_ANONYMOUS标志进行分配;当您释放此对象时,glibc可以将页面返回给操作系统,您的内存使用量将下降。

如果您有许多较小的分配,则您的内存可能会碎片化,以至于free(3)实际上无法释放可以返回给操作系统的整个页面。您在给定页面上可能使用相对较少的内容,但整个页面仍针对您的进程进行分配,并替换其他进程的整个页面数据。

如果您希望,可以使用mallopt(3)调整MMAP_THRESHOLD


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-- [ 匿名 ]

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


0

我认为其他问题并没有详细回答这个问题。

除了 sarnold所说的,在释放内存时,按照与malloc()相反的顺序释放内存可能会有所帮助,特别是对于较小的内存块。然后堆可以从末尾再次缩小...

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接