【问题标题】:detect memory leak with htop使用 htop 检测内存泄漏
【发布时间】:2011-05-17 19:36:10
【问题描述】:

伙计们,我创建了一个由 GTK+ 库和一些链表组成的应用程序

当我通过htop 看到资源时,它显示如下:

    1  [||||||||||||||||||||||                                                             24.4%]     Tasks: 117, 163 thr; 1 running
  2  [||||||||||||||||||||                                                               21.8%]     Load average: 0.22 5.09 7.51 
  Mem[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||               330/2003MB]     Uptime: 6 days, 02:09:22
  Swp[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  220/254MB]

  PID USER     PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 1843 rahulyud  20   0 94496  9296  5596 S 17.0  0.5  0:57.59 gnome-terminal
 1118 root      20   0 41112  8556  2612 S 14.0  0.4 25h13:05 /usr/bin/X :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-ubcbQV/database -nolisten tcp vt7
 3035 root      20   0  2808  1468  1056 R  5.0  0.1  0:11.30 htop
 1563 rahulyud  20   0  265M 19400  6792 S  4.0  0.9 12h17:58 compiz
 2594 rahulyud  20   0  373M 25064 10316 S  1.0  1.2  0:13.75 /home/rahulyudi/NetBeansProjects/mm/trunk/dist/Debug/GNU-Linux-x86/trunk

不幸的是,我对 unix htop-things 不是很熟悉, 我的应用程序使用 pid 2594 运行,但似乎 VIRT 成本资源太高 -> 373M,以为是 373 兆字节,对吗?反正这个尺寸正常吗?

VIRT,RES,SHR 到底是什么意思? 如何通过这些符号检测我的应用内存资源?

提前致谢;)

【问题讨论】:

    标签: c unix memory-leaks


    【解决方案1】:

    这不是 ps 命令。它是 top 或 htop 命令。你有别名集吗?

    VIRT 列是与任务相关的所有虚拟内存和页面文件,包括库和已分配但未使用的内存。 RES 是当前使用的物理内存。 SHR 是可以与其他进程共享的内存,例如共享库。

    有关这些命令的更多信息或详细信息,请键入:

    男人顶

    在您的终端。然后你可以使用 / 来搜索你的文本。

    编辑:

    对于以后遇到这个问题的人来说,我在freshmeat 上发现了一个名为memtime 的程序,它可以让您查看运行命令所使用的内存。这将解决您的问题,无需手动使用 htop 观看程序。

    【讨论】:

    • sorry for ps 命令,我只是想错了,这里你说 VIRT 列是所有与任务相关的虚拟内存和页面文件,包括库,以及 分配但未使用的内存,所以在 VIRT 上可以进行内存泄漏检测,不是吗?
    • 因为它是进程使用的总内存,是的。如果这个数字随着时间的推移而上升,那么你可能有内存泄漏。我不知道你的程序是做什么的。如果它需要随着时间的推移分配额外的内存,那么您将需要检查 VIRT 是否符合您的预期。或者,通过泄漏检查器运行您的程序。
    【解决方案2】:

    VIRT 代表进程的虚拟大小,它是它实际使用的内存、它映射到自身的内存(例如 X 服务器的显卡 RAM)、磁盘上已映射的文件的总和进入它(最显着的是共享库),以及与其他进程共享的内存。 VIRT 表示程序当前能够访问多少内存。 RES 代表常驻大小,它准确表示一个进程正在消耗多少实际物理内存。 (这也直接对应于 %MEM 列。)这实际上总是小于 VIRT 大小,因为大多数程序都依赖于 C 库。

    SHR 表示有多少 VIRT 大小实际上是可共享的内存或库)。就图书馆而言,这并不一定意味着整个图书馆都是常驻的。例如,如果一个程序只使用了库中的几个函数,则整个库都被映射并计入 VIRT 和 SHR,但只有包含正在使用的函数的库文件部分才会实际加载并计入在 RES 下。

    【讨论】:

      【解决方案3】:

      根据定义,内存泄漏不能通过一个快照暴露。当您泄漏内存时,您的进程随着时间的推移使用更多内存。虽然 373M 虚拟可能看起来很高,但除非您获得越来越多的内存,而应用程序没有做任何应该增加其内存使用的事情,否则您不能说您有泄漏。如果您怀疑自己有泄漏,您可能需要使用Valgrind 进行调查。

      【讨论】:

      • @capede:它在几乎每台机器上运行都很慢,因为它是一个模拟器。它之所以需要这样做,是因为没有其他方法可以验证内存是否已初始化,例如。
      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多