本文仅限记录自己的一次 内存泄露追踪小记。 可能并不十分适用与大家的情况。而且方法也并不是很smart。仅做记录,能提供个思路更好。 

 
    一、 要问调试程序遇到什么问题最头疼, 内存泄露肯定能排在前几名里的。  内存泄露一般是由于 在申请、释放内存的过程中,并没有将其正确的结对使用。 出现了申请了内存,但是未释放或者少释放了内存的情况。   内存泄露问题的出现,可能短时间内不会造成很大的影响。但是如果长时间运行程序, 内存会被逐步蚕食殆尽。 而造成服务器(主机)工作异常的情况,严重的造成其他程序没法正常工作,甚至宕机的情况。
 
    二、遇到、发现内存泄露
    内存泄露的问题,肯定不是一眼就看出来的。这个一般是长期观察, 或者某种情况重复执行,并查看内存的使用情况,发现内存可用值逐步变少。而且停止该情况的执行后,内存使用率并不恢复。 此时, 出现内存泄露的问题的可能性就很大了。
 
    三、找到内存泄露的必要条件
    发现内存泄露了。最重要的是找到内存泄露的必要条件。最好是找到最一针见血的泄露条件。这个过程可能会比较长,如果情况较简单的话还好说。 几种条件试下来 基本上就能摸个差不多了! 但是如果碰到较复杂的情况,那么需要多钟条件组合测试。 得出最根本的那个导致泄露的条件,成功就不远了!
 
    四、找到内存泄露的代码
    有了问题必现的条件, 那么接下来就得跟代码了(废话。。。)。 根据条件的处理过程一点点缕代码, 查看内存的分配及释放情况。查看是否有少释放的情况。 不过这种方法是最笨的方法。
 
    (1)介绍一个工具valgrind,虽然在我的debug 阶段并未给予太大的帮助,而且还帮了点倒忙。但不妨碍要夸它是一款 很好的跟踪内存问题的工具。
 
    具体的使用方法可以参考 IBM 大神的文章 http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/ 
 
    说说它的优点:
        不用向代码里特意插入新的跟踪代码。 仅在编译可执行程序时加入 -g 选项。 就可以使用valgrind 工具对其进行 内存调试啦。 方法还算简单些。
 
    但是有一点, 在我使用的程序中,是一个大循环。且是一个后台守护进程。  使用valgrind 就有点不方便了! 必现条件执行一次,非常之慢。。。 所以根据你的程序实际使用情况,甄别选用。如果没有其他思路的时候,可以使用该工具跑一下,没准就解决了呢!
 
    (2) 笨办法 在调用malloc/new, free/delete 等申请、释放内存的函数处,打印申请过程和一些基本信息(申请空间的大小,地址,也可以使用一个全局变量记下申请、释放的次数)。以便观察哪块有申请后,但没有找到对应的释放地方。
 
 
    总结来讲, 解决内存泄露没有非常便捷的办法。  预防方法就是规范自己的代码编写, 做好成对的申请与释放。 在处理异常情况返回、退出时记得释放之前申请的内存。养成编码的好习惯。   或者架构软件代码时,可以将内存申请、释放函数封装一下, 增加自己的调试信息进去。多一些必要的调试信息对解决问题有很大的帮助。
    出了内存泄露问题也不要太焦虑。没法快速解决问题也不要着急。 如果不是那种一眼就看出来就有泄露的地方, 基本上花费的时间都不会短。所以保持自己debug的热情,别气馁。  一般棘手问题的解决办法大多都是 缺了那么几行代码。找到解决办法后,也不要觉得自己菜鸟。 认为这么简单的问题花费了好长的时间 。 重要的是解决问题的过程。 每解决一个问题,你就进步了一次。

Linux 内存泄露小结的更多相关文章

  1. Linux内存分配小结--malloc、brk、mmap【转】

    转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...

  2. linux 内存泄露 valgrind

    内泄漏工具 valgrind: https://linux.die.net/man/1/valgrind www.valgrind.org/docs/manual/index.html www.val ...

  3. linux 内存泄露检测工具

    Valgrind Memcheck 一个强大开源的程序检测工具 下载地址:http://valgrind.org/downloads/current.html Valgrind快速入门指南:http: ...

  4. Linux内存使用情况以及内存泄露分析之工具与方法

    <Linux C/C++ Memory Leak Detection Tool> 1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=M ...

  5. Linux内存使用情况以及内存泄露情况

    1. 内存使用情况分析 http://www.360doc.com/content/15/1118/13/17283_514054063.shtml https://www.linuxidc.com/ ...

  6. linux下内存泄露检测工具Valgrind介绍

    目前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用 ...

  7. Linux kernel 内存泄露本地信息泄露漏洞

    漏洞名称: Linux kernel 内存泄露本地信息泄露漏洞 CNNVD编号: CNNVD-201311-467 发布时间: 2013-12-06 更新时间: 2013-12-06 危害等级:    ...

  8. linux下内存的统计和内存泄露类问题的定位

    在产品的开发中,通过对当前系统消耗内存总量的统计,可以对产品所需内存总量进行精确的评估,从而选择合适的内存芯片与大小,降低产品的成本.在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进 ...

  9. 利用linux的mtrace命令定位内存泄露(Memory Leak)

    一谈到内存泄露, 多数程序猿都闻之色变. 没错, 内存泄露非常easy引入. 但非常难定位.  以你我的手机为例(如果不常常关机). 如果每天泄露一些内存, 那么開始的一个星期, 你会发现手机好好的. ...

随机推荐

  1. 洛谷——P1349 广义斐波那契数列

    题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格 ...

  2. oracle charset

    select userenv('language') from dual; USERENV('LANGUAGE') ------------------------------------------ ...

  3. android 启动流程

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha adb shell 后  用 ps 命令 回车 可以看到 运行的进程. 如下结果: ct ...

  4. UVA11468 Substring --- AC自动机 + 概率DP

    UVA11468 Substring 题目描述: 给定一些子串T1...Tn 每次随机选择一个字符(概率会给出) 构造一个长为n的串S,求T1...Tn不是S的子串的概率 直接把T1...Tn建成AC ...

  5. Codeforces 839D Winter is here(容斥原理)

    [题目链接] http://codeforces.com/contest/839/problem/D [题目大意] 给出一些数,求取出一些数,当他们的GCD大于0时,将数量乘GCD累加到答案上, 求累 ...

  6. ms08-067漏洞的复现

    MS08-067漏洞重现 (1):MS08-067远程溢出漏洞描述 MS08-067漏洞的全称为“Windows Server服务RPC请求缓冲区溢出漏洞”,如果用户在受影响的系统上收到特制的 RPC ...

  7. hssworkbook 用法案例

    public ActionResult excelPrint() { HSSFWorkbook workbook = new HSSFWorkbook();// 创建一个Excel文件 HSSFShe ...

  8. 【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏

    [案例一] 作者:老王 如果PHP对象存在递归引用,就会出现内存泄漏.这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下: <?php class Foo { funct ...

  9. ubuntu 包管理详解

    http://www.cnblogs.com/forward/archive/2012/01/10/2318483.html

  10. spingBoot-自定义过滤器

    package com.cx.springboot.filters; import java.io.IOException; import javax.servlet.Filter; import j ...