我如何find哪个进程正在泄漏内存

我有一个系统(Ubuntu)与许多进程和一个(或多个)有内存泄漏。 有没有一种很好的方法来find泄漏的过程? 一些进程是JVM,有些则不是。 有些是本土的,有些是开源的。

Solutions Collecting From Web of "我如何find哪个进程正在泄漏内存"

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

  • RPRVT – 常驻私有地址空间大小
  • RSHRD – 驻留的共享地址空间大小
  • RSIZE – 驻留内存大小
  • VPRVT – 专用地址空间大小
  • VSIZE – 总内存大小

如果程序长时间泄漏,顶端可能不实用。 我会写一个简单的shell脚本,每隔X秒将“ps aux”的结果附加到一个文件,这取决于泄漏大量内存需要多长时间。 就像是:

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

除了顶部之外,您可以使用系统监视器(系统 – 管理 – 系统监视器,然后选择进程选项卡)。 选择查看 – 所有进程,进入编辑 – 首选项,并启用虚拟内存列。 按此列或Memory列排序

困难的任务。 我通常会建议拿一个像Valgrind这样的调试器/内存分析器,然后一个一个的运行程序。 不久或之后你会发现泄漏的程序,并可以告诉开发者或自己修复它。

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

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

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

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

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

我建议使用htop,作为顶层的一个更好的选择。