Linux内存泄漏

内存泄漏:内存泄漏一般指的是堆内存的泄漏。堆内存是指程序从堆中分配的、大小任意的(内存块的大小可以在程序运行期决定)、使用完后必须显示的释放的内存。应用程序一般使用malloc、realloc、new 等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用 free 或 delete 释放该内存块。否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

如何知道是否内存泄漏? 

有些简单的内存泄漏问题可以从在代码的检查阶段确定。还有些泄漏比较严重的,即在很短的时间内导致程序或系统崩溃,或者系统报告没有足够内存,也比较容易发现。最困难的就是泄漏比较缓慢,需要观测几天、几周甚至几个月才能看到明显异常现象。那么如何在比较短的时间内检测出有没有潜在的内存泄漏问题呢?实际上不同的系统都带有内存监视工具,我们可以从监视工具收集一段时间内的堆栈内存信息,观测增长趋势,来确定是否有内存泄漏。在 Linux 平台可以用 ps 命令,来监视内存的使用,比如下面的命令 (观测指定进程的VSZ值):

查看内存泄漏的命令

ps 命令

top 命令

free 命令

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

1.ps命令

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关键字的进程信息

2.top命令

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

top -d -3     //3s 显示一次

top -p 1921 //显示进程号为 1921 的进程的信息

 3.free命令

free 命令可以显示当前系统内存使用情况,主要用于确定设备是否存在内存泄漏。free 命令中的信息都来自于 /proc/meminfo 文件。

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

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

 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:    用来给文件做缓存大小     

 Linux 内存泄露检测工具(一):mtrance

mtrace是一个C函数,在里声明及定义,函数原型为:

void mtrace(void);

其实mtrace是类似malloc_hook的 malloc handler,只不过mtrace的handler function已由系统为你写好,但既然如此,系统又怎么知道你想将malloc/free的记录写在哪里呢?为此,调用mtrace()前要先设置 MALLOC_TRACE环境变量:

#include

....

setenv("MALLOC_TRACE", "output_file_name", 1);

...

output_file_name就是储存检测结果的文件的名称。

但是检测结果的格式是一般人无法理解的,而只要有安装mtrace的话,就会有一名为mtrace的Perl script,在shell输入以下指令:

mtrace [binary] output_file_name

就会将output_file_name的內容转化成能被理解的语句,例如「No memory leaks」,「0xLinux 内存泄露检测工具(二):memwatch12345678 Free 10 was never alloc」诸如此类。

Linux 内存泄露检测工具(二):memwatch 

和dmalloc一样,它能检测未释放的内存、同一段内存被释放多次、位址存取错误及不当使用未分配之内存区域。

下载地址1:http://www.hnlyyk.icoc.cc/col.jsp?id=103 点击打开链接 最新版本memwatch-2.71.tar.gz

下载地址2:http://www.linkdata.se/downloads/sourcecode/memwatch/memwatch-2.71.tar.gz

很幸运地,memwatch根本是不需要安装的,因为它只是一组C程序代码,只要在你程序中加入memwatch.h,编译时加上-DMEMWATCH -DMW_STDIO及memwatch.c就能使用memwatch,例如:

gcc -DMEMWATCH -DMW_STDIO test.c memwatch.c -o test

memwatch输出结果

memwatch 的输出文件名称为memwatch.log,而且在程序执行期间,所有错误提示都会显示在stdout上,如果memwatch未能写入以上文件,它会尝试写入memwatchNN.log,而NN介于01至99之间,若它仍未能写入memwatchNN.log,则会放弃写入文件。

Memwatch 的优点是无需特別配置,不需安装便能使用,但缺点是它会拖慢程序的运行速度,尤其是释放内存时它会作大量检查。但它比mtrace和dmalloc多了一项功能,就是能模拟系统内存不足的情況,使用者只需用mwLimit(long num_of_byte)函数来限制程式的heap memory大小(以byte单位)。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值