一.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: 用来给文件做缓存大小
其他的参数暂不做解释。