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

25 linux ubuntu memory-leaks

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

Ada*_*eld 14

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

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

  • 我正在尝试这个,但无论我传递到顶部的命令行参数,它都没有给出具有此信息的输出.我得到像'PID用户PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND`.有关如何获得所需输出的任何建议吗? (3认同)

Dpr*_*ado 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
Run Code Online (Sandbox Code Playgroud)


小智 6

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


dmi*_*gov 5

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


use*_*493 5

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

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

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


une*_*ist 4

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