如何检测内存泄漏 Ubuntu

内存泄漏可能有多种原因 Ubuntu, 但幸运的是,当它们发生时很明显。 错误代码通常是主要原因,因为程序员可能没有机会检查以确保释放不再需要的内存。 如果您一直在安装不稳定的软件包或从源代码编译代码,您可能会因此处理内存泄漏。 您可能会开始注意到它们,因为当您安装了足够多的物理 RAM 时,软件应用程序包开始抱怨内存不足。

如果您担心内存泄漏,请尝试在终端中重复输入 free。 如果您突然开始看到您的 RAM 使用量快速增长,那么您已经检测到内存泄漏。 如果你收到类似这样的错误 bash: 执行此操作时内存不足,您只打开了一个终端甚至一个虚拟控制台,那么您几乎可以肯定正在处理一个。 一些内存泄漏可能更微妙一些,但是 Ubuntu 及其各种工具和衍生功能包可以帮助您发现它们。

检测内存泄漏 Ubuntu

由于用于检测内存泄漏的工具主要基于 CLI 标志,因此使用哪个版本并不重要 Ubuntu 你处决他们。 这些应该可以在常规 Ubuntu 上的 Unity 终端中从虚拟控制台正常工作 Ubuntu 服务器,来自 Lubuntu 中的 lxterm、Kubuntu 中的 Konsole 甚至 Xubuntu 中的 Xfce。 尝试做一个简单的任务,比如 sudo -s 并输入您的密码以开始使用。

如果操作正确,这应该会为您提供一个 root shell,但如果您正在使用已经过时的越狱,则可能会导致内存错误。 如果您确实可以访问 root shell,请尝试输入 echo 3 > /proc/sys/m/drop_caches,按回车键,然后输入 exit。 再次尝试运行 free 或 free -m 以查看是否有助于释放内存。

一些程序员争辩说,强迫内核放弃它的缓存是没有意义的,因为一旦需要额外的物理内存,它们就应该被刷新和恢复。 然而,虽然强行刷新这些缓存会损害系统性能,但请注意,这只是一个测试。 重新启动系统后, Linux 内核应该再次按照最初的方式组装内存缓存。

有人建议添加行同步; sudo echo 3 > /proc/sys/vm/drop_caches 到 cron 不断运行的脚本,但这首先违背了内存缓存的目的。 空闲内存本身只是未使用的 RAM,这意味着必须从更慢的速度加载数据。 机电的 或 NAND 存储设备。 无论这些设备有多快,它们都没有 RAM 快,这意味着虽然您应该修复内存泄漏,但一旦您将其设置为最佳设置,您就不应该乱用缓存系统。

如果您确定在使用机器时确实确实存在定期发生的持续内存泄漏并且无法具体减少,但您仍然可以访问 CLI,请尝试运行 top 命令。 这应该为您提供正在运行的进程列表。

应该 Ubuntu 给你一个关于 top 的异常错误,然后尝试发出 busybox top 来访问这个程序的一个更简单的版本。 获得列表后,查看 %MEM 或类似列以了解哪些应用分配的内存最多。 虽然您可以记下 PID 并向 PID 的确切编号发出删除命令,但这只会强制应用程序关闭。 执行此操作后,它们使用的内存可能仍未释放,尽管这当然值得一试。

如果您发现某个应用程序正在使用大量内存,请按 q 退出,然后尝试从上一屏幕中删除带有 PID 编号的####。 系统进程不应该以这种方式被杀死,任何你没有保存的工作也不应该被杀死。 把这想象成类似于使用 Ctrl+Alt+Del 任务列表删除某些内容,您也可以将其用于同一过程。

当您发现某个程序经常发生这种情况时,您可以对其进行配置以防止将来出现这种行为。 当然,每个单独的程序都需要不同的资源,这超出了检测内存泄漏的任务。

如果您不仅要对应用程序进行故障排除,还要处理代码,那么您还有其他一些资源。 Ubuntu 及其衍生产品为您提供 membarrier、memusage 和 memusagestat C 编程例程。

简单地使用 man membarrier,man memusage 或 man memusagestat for ver el Linux 有关这些重要例程的程序员手册页。 如果库的未来版本有更新,比如新版本的 Ubuntu 退出,则更改将始终列在此处。

如果您需要图形内容,memusagestat 甚至提供了将内存使用情况的图形表示保存到 PNG 文件的选项。 这也使它成为实用程序作者的一个有吸引力的功能,因为它可用于构建定期检查内存泄漏的应用程序。

您还可以安装 memprof,这是一个内存使用情况分析工具,可帮助您发现内存泄漏。 生成有关您正在编写的程序中每个函数分配的内存量的配置文件。 它还可以扫描现有内存以查找已分配但不再真正被引用的块。 它通过预加载一个库来覆盖标准 C 库的内存分配函数来实现这一点。

如果您打算使用它,请务必在发布之前从代码的开头删除 include memprof 行。 这用于确保没有泄漏,但如果您打包代码并将其发布到存储库,它不应该成为依赖项。

接下来阅读

  • Ubuntu 18.04 LTS Bionic Beaver 正式可用于 UbuntuKubuntu,…
  • Ubuntu 16.04.5 LTS 之后立即发布 Ubuntu 18.04 LTS,所有过去的软件包……
  • 已解决:libvirt-bin 中的“无法初始化审计层:权限被拒绝”错误……
  • 什么是内存泄漏? 如何预防?