一种内存泄露的检测方法和装置的制造方法

文档序号:8258340阅读:228来源:国知局
一种内存泄露的检测方法和装置的制造方法
【技术领域】
[0001] 本发明涉及测试技术领域,特别是涉及一种内存泄露的检测方法和一种内存泄露 的检测装置。
【背景技术】
[0002] 在计算机科学中,内存泄露是指由于疏忽或错误造成程序未能释放已经不再使用 的内存的情况。内存泄露并非指内存在物理上的消失,而是应用程序分配某段内存后,由于 设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
[0003] 随着现代软件规模日益扩大,在需要软件开发人员显示申请、释放内存的软件开 发过程中,由于往往需要随着业务流或控制流的处理而进行大量的内存申请和释放,很容 易造成在一些异常分支的遗漏释放而出现内存泄露的情形,然而这种内存泄露的事件一般 都是少量、且隐蔽的,需要经过很长时间的积累甚至已经造成了严重后果才能被察觉。因 此,软件开发人员难以检测和恢复泄露的内存。
[0004] 目前,虽然已经有一些辅助工具可以协助进行内存泄露的检测,但由于这些辅助 工具并不清楚软件开发人员的设计、使用意图,极易造成误判或漏判,且由于其插粧的实现 或算法复杂性因素,往往会引起程序运行缓慢的问题,并且使用成本较高。
[0005] 因此,软件开发人员检测和恢复泄露的内存存在这样几种思路,第一种是将系统 运行过程中动态内存的所有申请、释放过程通过日志文件的形式保存下来供离线分析,所 谓离线分析是指在目标系统外进行检测。然而,离线分析缺少实时性且不够直观,同时对日 志文件的管理以及读写等慢速I〇(Input/Output,输入/输出)操作导致软件性能降低。
[0006] 第二种思路是支持手动提取当前已申请内存的相关信息并打印出来,采用提取多 次打印的结果人工对照的方式进行检测,这种思路虽然可行,但人工对照费时费力,且不易 操作。
[0007] 第三种思路是在内存申请与内存释放时对内存地址的使用记录做Hash (哈希)运 算查找,通过查找来添加或删除内存块的使用记录,然而,Hash运算需要申请一块额外的内 存来记录原内存的申请、释放信息,因此,第三种思路的工作效率较低。
[0008] 因此,目前需要本领域技术人员迫切解决的一个技术问题就是:提供一种内存泄 露的检测方法和装置,用以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操 作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性, 同时支持在执行实体生命周期内回收已泄露内存。

【发明内容】

[0009] 本发明实施例所要解决的技术问题是提供一种内存泄露的检测方法,用以实时并 直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度, 提高工作效率,降低成本,提高内存泄露检测的准确性,同时支持在执行实体生命周期内回 收已泄露内存。
[0010] 相应的,本发明实施例还提供了一种内存泄露的检测装置,用以保证上述方法的 实现及应用。
[0011] 为了解决上述问题,本发明公开了一种内存泄露的检测方法,内存中包括已分配 内存的双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,所述方法 包括:
[0012] 确定检测时间段区间;
[0013] 在所述双向链表中遍历出所述检测时间段区间内的内存头信息;
[0014] 依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。
[0015] 优选的,所述方法还包括:
[0016] 若判定对应的一个或多个已分配的内存块发生内存泄露,回收所述对应的一个或 多个已分配的内存块。
[0017] 优选的,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大 于所述起始时间戳,所述确定检测时间段区间的步骤包括:
[0018] 获取当前时刻对应的当前时间戳;
[0019] 采用预设的第一时间差和所述当前时间戳确定起始时间戳;
[0020] 采用预设的第二时间差和所述当前时间戳确定终止时间戳,所述第一时间差大于 第二时间差。
[0021] 优选的,所述内存头信息包括已分配的内存块的分配时间戳,所述在所述双向链 表中遍历出所述检测时间段区间内的内存头信息的步骤包括:
[0022] 在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳;
[0023] 判断所述分配时间戳是否在所述检测时间段区间内;
[0024] 若所述分配时间戳在所述检测时间段区间内,则提取出对应的内存头信息;
[0025] 若所述分配时间戳不在所述检测时间段区间内,则忽略对应的内存头信息。
[0026] 优选的,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及 调用函数在文件中的位置信息,所述依据所述内存头信息判断对应的一个或多个已分配的 内存块是否发生内存泄露的步骤包括:
[0027] 依据所述已分配的内存块的内存大小确定出一个或多个已分配的内存块;
[0028] 结合所述调用函数信息以及调用函数在文件中的位置信息判断所述一个或多个 已分配的内存块在所述当前时间戳之前是否需要释放;
[0029] 若判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际 未释放,则判定所述一个或多个已分配的内存块发生内存泄露;否则,判定所述一个或多个 已分配的内存块未发生内存泄露。
[0030] 根据本发明的实施例,还公开了一种内存泄露的检测装置,内存中包括双向链表, 所述双向链表包括一个或多个已分配的内存块的内存头信息,所述装置包括:
[0031] 检测时间段区间确定模块,用于确定检测时间段区间;
[0032]内存头信息遍历模块,用于在所述双向链表中遍历出所述检测时间段区间内的内 存头彳目息;
[0033]内存泄露判断模块,用于依据所述内存头信息判断对应的一个或多个已分配的内 存块是否发生内存泄露。
[0034] 优选的,所述装置还包括:
[0035] 已分配的内存块回收模块,用于在判定对应的一个或多个已分配的内存块发生内 存泄露时,回收所述对应的一个或多个已分配的内存块。
[0036] 优选的,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大 于所述起始时间戳,所述检测时间段区间确定模块包括:
[0037] 当前时间戳获取子模块,用于获取当前时刻对应的当前时间戳;
[0038] 起始时间戳确定子模块,用于采用预设的第一时间差和所述当前时间戳确定起始 时间戳;
[0039] 终止时间戳确定子模块,用于采用预设的第二时间差和所述当前时间戳确定终止 时间戳,所述第一时间差大于第二时间差。
[0040] 优选的,所述内存头信息包括已分配的内存块的分配时间戳,所述内存头信息遍 历模块包括:
[0041] 分配时间戳遍历子模块,用于在所述双向链表中遍历出一个或多个已分配的内存 块的分配时间戳;
[0042] 分配时间戳判断子模块,用于判断所述分配时间戳是否在所述检测时间段区间 内;
[0043] 第一判定子模块,用于在所述分配时间戳在所述检测时间段区间内时,提取出对 应的内存头信息;
[0044] 第二判定子模块,用于在所述分配时间戳不在所述检测时间段区间内时,忽略对 应的内存头信息。
[0045] 优选的,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及 调用函数在文件中的位置信息,所述内存泄露判断模块包括:
[0046] 已分配的内存块确定子模块,用于依据所述已分配的内存块的内存大小确定出一 个或多个已分配的内存块;
[0047] 已分配的内存块释放判断子模块,用于结合所述调用函数信息以及调用函数在文 件中的位置信息判断所述一个或多个已分配的内存块在所述当前时间戳之前是否需要释 放;
[0048] 泄露判定子模块,用于在判定所述一个或多个已分配的内存块在所述当前时间戳 之前需要释放而实际未释放时,判定所述一个或多个已分配的内存块发生内存泄露。
[0049] 与现有技术相比,本发明实施例包括以下优点:
[0050] 本发明通过查询检测时间段区间内的内存头信息,可以监测到发生内存泄露的可 疑的泄露点,有效缩小检测范围,从而降低查询结果规模,并且,双向链表及内存头信息对 内存申请、释放的代码无需修改,仅需要在一个公共头文件中引用,避免影响用户使用,可 以降低部署及实施的难度,因此,可以实时并直观检测出内存泄露,提高软件性能,减少或 避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测 的准确性,同时支持在执行实体生命周期内回收已泄露内存。
[0051] 进一步地,本发明通过在用户申请内存时,预留空间用于存储内存头信息,并且将 预留空间挂载在双向链表上,可以在用户释放内存时避免查找,通过直接定位可以快速摘 除待释放内存的链表节点,在内存的申请、释放过程中避免了查找过程,执行时间极短,大 大降低了对系统性能的消耗。
[0052] 更进一步地,本发明通过起始时间戳、终止时间戳以及回收所述对应的一个或多 个已分配的内存块,可以对指定检测时间段区间内由指定的某申请者申请的、特定大小的 内存块集合进行强制释放,从而可以在系统不中断服务的情形下回收已泄露的内存,避免 了重启单板或进程等破坏性的恢复操作,有效提升软件的稳定性指标。
[0053] 更进一步地,本发明通过在所述双向链表中遍历出一个或多个已分配的内存块的 分配时间戳,可以通过命令的方式迅速找到发生内存泄露的内存头信息,有效降低人力投 入,结合内存头信息检测源码可以找到内在泄露的原因,因此,可以实时并直观检测出内存 泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1