Linux下如何查看内存泄露的命令

 更新时间:2023年09月04日 08:43:58   作者:凌肖战  
这篇文章主要介绍了Linux下如何查看内存泄露的命令方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Linux下确定内存泄露

在做嵌入式开发中,例如,在 Linux 下做 C/C++ 开发,会因为调用 malloc/calloc() 函数,忘记释放堆内存。程序运行久了,会发生内存泄露问题。

Linux 环境的 C/C++ 开发中,但是,当每次只是发生几个字节的内存泄露时,可以写一段测试内存泄露的代码来确认。

而当代码中发生可见的大量的内存泄露问题时,可以使用 shell 命令来确认。

这里介绍 发生大量的内存泄露时,使用 shell 命令确认是否存在内存泄露的方法。

常用的命令包括如下 shell 命令:

  • ps 命令
  • top 命令
  • free 命令
  • cat /proc/meminfo 或 cat /proc/$pid/status 命令

1.ps 命令

ps 命令用来列出系统中当前正在运行的那些进程,列出的是当前那些进程的快照,就是执行 ps 命令的那个时刻的那些进程。

确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等。

ps 命令为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程实时监控,应该用 top 命令。

常用的命令如:

ps -ef | grep 进程关键字      //查看指定进程的信息
ps -aux       // 列出当前内存中的所有进程
ps aux --sort=%mem(或者 ps aux --sort %mem) //按照内存占用率的升序排序
ps aux --sort=-%mem  (或者 ps aux --sort -%mem) //按照内存占用率降序排序
ps aux | grep -e test       //打印含义test关键字的进程
ps -aux | grep -E "test|PID"      //打印 包含test关键字的进程信息

其中,ps -aux 是以 BSD 方式显示。ps -ef 是以 System V 方式显示,该种方式比 BSD 方式显示的多。

如下所示,使用  ps -aux | grep -E "gome|PID"  命令,可以显示包含 gome 关键字的进程信息,其中包括 CPU 占用,内存占用等。

2.top 命令

top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows 的任务管理器。

通常用来观察 CPU 或 内存的占用情况。

top 命令使用如下:

top -d -3     //3s 显示一次
top -p 1921 //显示进程号为 1921 的进程的信息

如下操作,输入 top -d 3 -p 1921 命令,表示 3 s 显示一次进程号为 1921的进程的信息。

3.free 命令

free 命令可以显示当前系统内存使用情况,主要用于确定设备是否存在内存泄漏。

free 命令中的信息都来自于 /proc/meminfo 文件。

默认情况下,即在没有选项的情况下,free 命令显示内存的使用信息。默认按照 k(b) 的计数单位统计。

free 命令使用如下:

  • free -s 3:表示每隔 3 秒打印一次内存信息

如下操作,输入  free -s 3 -h 命令,表示 3 s 显示一次内存使用情况:

我们可以通过在设备启动和运行一段时间后,使用 free 命令查看 已使用内存(used) 的大小并进行对比,如果运行一段时间后 used内存 有很明显的增大,那很有可能是存在内存泄漏。

4.cat /proc/meminfo 或 cat /proc/$pid/status 命令

  • cat /proc/meminfo 命令用来查看 Linux 系统的内存使用情况。
  • cat /proc/$pid/status 命令,用来查看某个进程的内存使用信息。

查看 RAM 使用情况最简单的方法是通过 /proc/meminfo。

这个动态更新的虚拟文件实际上是许多其他内存相关工具 (如 free / ps / top 命令) 等的组合显示。

注意:这个文件显示的单位是 kB 而不是 KB,1kB = 1000B,但是实际上应该是KB,1KB=1024B。

这个显示是不精确的,是一个已知的没有被更正的历史遗留问题。

因为很多程序依赖这个文件查看内存使用的是kB字符

如下所示:

如上所示,其中解释一下重要字段。

如下:

  • MemTotal:应用可以使用的内存总数
  • MemFree:当前空闲的内存数目    
  • MemAvailable:可用内存(MemFree + 可回收的内存),系统中有些内存虽然已被使用,但是可以回收,如cache、buffer、slab都有一部分可以回收。
  • Buffers:用来给文件做缓存大小     

其他的参数暂不做解释。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 在AWS的Linux服务器部署Flask预演(详细步骤)

    在AWS的Linux服务器部署Flask预演(详细步骤)

    这篇文章主要介绍了在AWS的Linux服务器部署Flask预演,部署Flask应用程序到AWS Linux服务器,你可以选择多种方式,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Linux系统中安装Git全过程

    Linux系统中安装Git全过程

    文章介绍了在Linux系统中安装Git的两种方法:使用包管理器安装和从源代码编译安装,包管理器安装简单快捷,但可能无法安装特定版本的Git;从源代码编译安装可以安装特定版本并进行自定义配置,但需要手动编译,两种方法各有优缺点,具体选择取决于用户需求
    2025-03-03
  • Linux下监视NVIDIA的GPU使用情况详解

    Linux下监视NVIDIA的GPU使用情况详解

    这篇文章主要介绍了Linux下监视NVIDIA的GPU使用情况详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 如何在Linux中自定义bash命令提示符

    如何在Linux中自定义bash命令提示符

    这篇文章主要给大家介绍了关于如何在Linux中自定义bash命令提示符的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 详解centos下搭建redis集群

    详解centos下搭建redis集群

    这篇文章主要介绍了详解centos下搭建redis集群,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • linux系统终端修改字体的方法

    linux系统终端修改字体的方法

    我们以debian为例,介绍两种linux修改终端字体的设置方法,大家参考使用吧
    2014-01-01
  • Linux创建进程达到65535的方法

    Linux创建进程达到65535的方法

    这篇文章主要介绍了Linux创建进程达到65535的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 解决atd服务报错Failed with result‘exit-code‘问题

    解决atd服务报错Failed with result‘exit-code‘问题

    在isoftserveros-v5.1-oe1-aarch64系统中,安装at软件包后,由于手动执行导致atd守护进程出错,通过查看后台Process行,手动kill原atd进程,使用systemctl重启atd服务后,问题得以解决,此经验可为类似情况提供参考
    2024-09-09
  • Centos7下编译安装配置Nginx+PHP+MySql环境

    Centos7下编译安装配置Nginx+PHP+MySql环境

    这篇文章主要介绍了Centos7下编译安装配置Nginx+PHP+MySql环境,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Linux如何实现给/根目录扩容

    Linux如何实现给/根目录扩容

    这篇文章主要介绍了Linux如何实现给/根目录扩容问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论