如何找到哪个进程正在泄漏内存[关闭](how do i find which process is

2019-07-18 08:45发布

我有许多进程和一个(或多个)有内存泄漏的系统(Ubuntu的)。 有没有发现有泄漏过程的好方法? 有些过程是JVM中,有些则不是。 有些是土生土长有些是开源的。

Answer 1:

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

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


Answer 2:

如果程序泄露过了很久,顶部可能是不实际的。 我会写追加“的ps aux”的结果到一个文件中每X秒,取决于需要多长时间泄漏显著的内存量一个简单的shell脚本。 就像是:

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


Answer 3:

除了顶部,您可以使用系统监视器(系统 - 管理 - 系统监控器,然后选择进程选项卡)。 选择查看 - 所有进程,去编辑 - 首选项,并启用虚拟内存列。 排序或者通过此柱,或者通过存储器列



Answer 4:

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



Answer 5:

至于suggeseted,要走的路是Valgrind的。 这是检查你的应用程序的运行性能的许多方面,包括内存用量探查。

通过Valgrind的运行你的应用程序将允许你,如果你忘记释放内存使用malloc分配的,如果你释放同一内存的两倍等验证



Answer 6:

如果你不能做到这一点演绎,考虑信号弹调试模式:以10的倍数增加的一个进程分配的内存量。 然后运行程序。

如果泄漏的存储器的量是相同的,这一过程是不泄漏的来源; 恢复过程,并作出同样的修改到下道工序。

当你打的过程,是负责任的,你会看到你的内存泄漏跳(以下简称“信号弹”)的大小。 您可以通过有选择地增加这个过程中分别发表的声明分配尺寸进一步缩小范围。



Answer 7:

我建议使用HTOP的,作为一个更好的选择到顶部。



文章来源: how do i find which process is leaking memory [closed]