使用htop检测内存泄漏

4

大家好,我创建了一个应用程序,其中包含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个回答

7
那不是ps命令,而是top或htop命令。你有设置别名吗?
VIRT列是与任务相关的虚拟内存和页面文件,包括库和已分配但未使用的内存。RES是当前正在使用的物理内存。SHR是可与其他进程共享的内存,例如共享库。
要获取有关这些命令的更多信息或详细信息,请在终端中键入:
man top 然后,您可以使用/搜索您的文本。
编辑:
只是一个快速提醒,对于以后遇到此问题的任何人,我在freshmeat上找到了一个名为memtime的程序,它允许您查看运行的命令使用的内存。这将解决您的问题,无需手动使用htop观察程序。

对于之前的 ps 命令,我误解了你的意思。在这里,你说 VIRT 列是与任务相关的所有虚拟内存和页面文件,包括库以及已分配但未使用的内存,因此可以通过检测 VIRT 来发现内存泄漏,是吗? - capede
1
由于它是进程使用的总内存,所以是的。如果这个数字随着时间的推移而增加,那么你可能有一个内存泄漏。我不知道你的程序是做什么的。如果它需要随着时间分配额外的内存,那么你需要检查VIRT是否符合你预期的需求。否则,可以通过泄漏检测器运行你的程序。 - Spencer Rathbun

3

VIRT代表进程的虚拟大小,包括它实际正在使用的内存、被映射到自身的内存(例如X服务器的视频卡RAM)、已经映射到其上的磁盘文件(最显著的是共享库)以及与其他进程共享的内存。VIRT表示程序当前可以访问多少内存。RES代表Resident Size,准确地表示进程实际消耗的物理内存量。(这也直接对应于%MEM列)。这通常会比VIRT大小小,因为大多数程序依赖于C库。

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


2

按照定义,内存泄漏不可能在一个快照中暴露出来。当你泄漏内存时,你的进程会随着时间的推移使用更多的内存。虚拟内存为373M可能看起来很高,但除非应用程序没有执行任何应该增加其内存使用的操作,否则你不能说你有内存泄漏。如果你怀疑自己有内存泄漏,你可以考虑使用Valgrind


@capede:它在几乎每台机器上都运行缓慢,因为它是一个模拟器。它需要这样做,因为没有其他方法可以验证内存是否已初始化,例如。 - 0xC0000022L

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