用htop检测内存泄漏

时间:2011-05-17 19:36:11

标签: c unix memory-leaks

伙计们,我创建了一个由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 - 事情, 我的应用程序使用pid 2594运行,但似乎VIRT成本资源太高 - > 373M,认为它 373兆字节,我是对的吗?无论如何这个大小正常吗?

真正的VIRTRESSHR是什么意思? 如何通过这些符号检测我的应用内存资源?

提前谢谢;)

3 个答案:

答案 0 :(得分:6)

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

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

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

  

man top

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

修改

对于后来遇到此问题的人来说,我只是快速了解一下,我发现了一个名为memtime的freshmeat程序,它允许您查看用于运行命令的内存。这将解决您的问题,而无需使用htop手动观看程序。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

SHR表示VIRT大小实际上是多少可共享的内存或库。对于库,它并不一定意味着整个库是驻留的。例如,如果程序仅使用库中的一些函数,则整个库将被映射并将在VIRT和SHR中计数,但只有包含正在使用的函数的库文件的部分才会被实际加载并计数在RES。