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

时间:2020-03-06 14:49:32  来源:igfitidea点击:

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

解决方案

困难的任务。我通常建议抓住像Valgrind这样的调试器/内存分析器,并在其中一个接一个地运行程序。迟早我们会发现该程序泄漏,可以告诉开发者或者自己修复它。

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

  • RPRVT-居民专用地址空间大小
  • RSHRD-居民共享地址空间大小
  • RSIZE-常驻内存大小
  • VPRVT-专用地址空间大小
  • VSIZE-总内存大小

就像建议的那样,走的路是瓦尔格朗德。它是一个探查器,用于检查应用程序运行性能的许多方面,包括内存使用情况。

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

除了顶部之外,我们还可以使用系统监视器(系统管理,然后单击系统监视器,然后选择"进程"选项卡)。选择"查看所有进程",转到"编辑首选项"并启用"虚拟内存"列。按此列或者按"内存"列排序

如果程序长时间泄漏,则top可能不切实际。我将编写一个简单的shell脚本,该脚本每隔X秒将" ps aux"的结果添加到文件中,具体取决于泄漏大量内存所需的时间。就像是:

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

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

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

当我们执行负责的过程时,我们会看到内存泄漏跳跃的大小(​​"信号光斑")。我们可以通过在此过程中有选择地增加各个语句的分配大小来进一步缩小范围。

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