我如何找到泄漏内存的进程

时间:2008-09-27 15:18:24

标签: linux ubuntu memory-leaks

我有一个包含许多进程的系统(Ubuntu),其中一个(或多个)有内存泄漏。有没有找到泄漏过程的好方法?有些过程是JVM,有些则不是。有些是自家种植的,有些是开源的。

7 个答案:

答案 0 :(得分:14)

您可以运行top命令(以非交互方式运行,键入top -b -n 1)。要查看泄漏内存的应用程序,请查看以下列:

  • RPRVT - 常驻私人地址空间大小
  • RSHRD - 驻留共享地址空间大小
  • RSIZE - 常驻内存大小
  • VPRVT - 私人地址空间大小
  • VSIZE - 总内存大小

答案 1 :(得分:9)

如果程序长时间泄漏,top可能不实用。我会编写一个简单的shell脚本,每隔X秒将“ps aux”的结果附加到一个文件中,具体取决于泄漏大量内存所需的时间。类似的东西:

while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done

答案 2 :(得分:5)

除了top之外,您还可以使用系统监视器(系统 - 管理 - 系统监视器,然后选择进程选项卡)。选择View - All Processes,转到Edit - Preferences并启用Virtual Memory列。按此列或按内存列

排序

答案 3 :(得分:3)

艰巨的任务。我通常会建议使用像Valgrind这样的调试器/内存分析器,并在其中逐个运行程序。不久之后,你会发现泄漏的程序,并告诉它devloper或自己修复它。

答案 4 :(得分:3)

如上所述,要走的路是valgrind。它是一个分析器,可以检查应用程序运行性能的许多方面,包括内存的使用情况。

通过Valgrind运行您的应用程序将允许您验证是否忘记释放分配有malloc的内存,如果您释放相同的内存两次等。

答案 5 :(得分:3)

如果你不能演绎,请考虑Signal Flare调试模式:将一个进程分配的内存量增加十倍。然后运行你的程序。

如果泄漏的内存量相同,则该过程不是泄漏源;恢复过程并对下一个过程进行相同的修改。

当您点击负责的过程时,您会看到内存泄漏的大小(“信号弹”)。您可以通过在此过程中有选择地增加单独语句的分配大小来进一步缩小范围。

答案 6 :(得分:3)

我建议使用htop作为top的更好替代品。