【问题标题】:How can I get the memory of one process in Linux [duplicate]如何在 Linux 中获取一个进程的内存 [重复]
【发布时间】:2012-05-11 15:33:40
【问题描述】:

可能重复:
Linux: How to measure actual memory usage of an application or process?

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

【问题讨论】:

  • 您想从您的程序中通过 C API 获取该进程的内存使用情况(可能是该进程或通过 shell 命令)?
  • 我认为这应该是评论而不是答案
  • @Sam,是的,但是 sebif 距离能够发布 cmets 仅两点之遥...
  • ... 现在,您可以将其重新发布为评论。 :)
  • 我从 shell 命令 'top' 中得知,当我采取一些行动时,我的 C 进程正在占用越来越多的操作系统存储空间,并且我知道我已经“释放”了所有的“malloc” '。

标签: linux unix


【解决方案1】:

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

free()ed 的内存实际上并没有返回给操作系统 直到进程终止,如此多的分配周期 并逐渐释放更大的内存块将导致 成长的过程。 (via)

This question has been already answered in more detail on another SO thread.你可能会在那里找到答案。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      cat /proc/<PID>/status
      

      这应该是你想知道的全部。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          你可以试试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-- [匿名]

          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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-28
            • 2012-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-02
            • 2014-02-06
            相关资源
            最近更新 更多