7

可能重复:
Linux:如何测量应用程序或进程的实际内存使用情况?

为什么我在Linux中使用'top'来显示我对一个进程的内存,我知道进程的存储只会增加并且不会减少,除非我关闭所有进程。我不知道为什么,虽然我使用'free ' 仅在 'malloc' 之后。我怎样才能获得我的流程的正确实际实时存储?谢谢大家。

4

5 回答 5

8

找到pid,如果它以同一用户身份运行,则使用“ps aux”,否则使用“ps ax”,然后执行以下命令:

cat /proc/<PID>/status

这应该是你想知道的。

于 2012-05-02T06:59:51.493 回答
6

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

在进程终止之前,free()ed 的内存实际上不会返回给操作系统,因此分配和释放越来越大的内存块的许多循环将导致进程增长。(通过

这个问题已经在另一个 SO 线程上得到了更详细的回答。你可能会在那里找到答案。

于 2012-05-02T06:57:21.253 回答
1

根据分配的大小,您的内存可能会或可能不会返回给操作系统。如果您要分配的东西(参见MMAP_THRESHOLD参考资料malloc(3)),占用许多内存页的东西,glibc 将使用mmap(2)'MAP_ANONYMOUS标志进行分配;当你使用free(3)这个对象时,glibc 可以将页面返回给操作系统,你的内存使用量就会下降。

如果你愿意,你可以MMAP_THRESHOLD调低使用。mallopt(3)

如果您有许多较小的分配,您的内存可能会碎片化free(3)实际上无法释放可以返回给操作系统的整个页面。您可能在给定页面上使用的资源相对较少,但整个页面仍然分配给您的进程,并且它替换了来自其他进程的整个页面的数据价值。

于 2012-05-02T06:57:46.127 回答
0

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

添加到sarnold 所说free()的内容中,以相反的顺序可能会有所帮助malloc()- 特别是对于较小的内存块。然后堆可以从最后再次收缩......

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

于 2012-05-02T08:04:21.397 回答
0

您可以尝试 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

于 2012-05-03T06:47:55.993 回答