内存空洞检测和清除的方法和装置的制作方法

文档序号:6433470阅读:283来源:国知局
专利名称:内存空洞检测和清除的方法和装置的制作方法
技术领域
本发明涉及内存优化领域,尤其涉及一种内存空洞检测和清除的方法和装置。
背景技术
在Linux和Unix操作系统中,内存管理器对于小于规定阈值(例如128k)的内存 申请是通过直接调整堆顶指针的位置来完成的。在释放堆中对应的内存块时,当内存管理 器发现堆顶有连续的所设阈值大小的空间是空闲的时候,就会调整堆顶的位置,将占用的 内存返回给系统。此时,内核会通过删除相应的线性区,来释放占用的物理内存。如果堆顶 有一块正在使用的内存,而下面有很大的连续内存已经被释放掉了,那么这块内存和对应 的物理内存是不能够被立即释放。这也就是说,只要堆顶部分的申请内存还在占用,下面释 放的内存再多,都不会被返回到系统中,仍然占用着物理内存,这就是所谓的内存空洞。
在实现本发明的过程中,发明人发现现有技术中对于内存较小的设备,在经过大 量的小块内存分配就不可避免的会产生内存空洞,造成内存空间的闲置,这样对于内存空 间非常宝贵的设备来说,内存不能被充分利用,影响了其他内存申请。发明内容
本发明的实施例提供一种内存空洞检测和清除的方法和装置,减少了内存空洞的 出现,提高了内存的利用率。
为达到上述目的,本发明采用如下技术方案
一种内存空洞检测和清除的方法,包括
当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的 首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状态为使用;
当第一条内存使用记录存入内存记录链表中时,所述内存空洞检测装置启动内存 空洞检测装置中的定时器;
所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记 录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的 链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址一,和在所述首地 址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所述首地址一和首地 址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一和首地址 二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所述内存记录链表中的 第一条内存使用记录;
当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空 洞,重启定时器。
一种内存空洞检测和清除的装置,包括
记录单元,用于当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状 态为使用;
启动单元,用于当第一条内存使用记录存入内存记录链表中时,所述内存空洞检 测装置启动内存空洞检测装置中的定时器;
修改记录单元,用于所述进程从堆中申请成功的内存被释放时,所述内存空洞检 测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为 释放;
检测单元,用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述 内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址 一,和在所述首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所 述首地址一和首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述 首地址一和首地址二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所述 内存记录链表中的第一条内存使用记录;
清除单元,用于当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测 装置清除内存空洞,重启定时器。
本发明实施例提供的一种内存空洞检测和清除的方法和装置,内存空洞检测装置 将进程从堆中申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录 链表中,通过所述内存记录链表中的内存使用记录的状态,检测堆中的内存空洞,并将其清 除。本发明实施例解决了现有技术中,对于内存较小的设备,在经过大量的小块内存分配就 会产生内存空洞,内存不能被充分利用的问题,减少了内存空洞的出现,提高了内存的利用 率。


图1为本发明实施例一提供的一种内存空洞检测和清除的方法主要操作步骤流 程图2为本发明实施例一提供的一种内存空洞检测和清除的方法中内存空洞示意 图3为本发明实施例一提供的一种内存空洞检测和清除的方法中内存空洞释放 示意图4为本发明实施例一提供的一种内存空洞检测和清除的方法中堆中内存与所 述内存记录链表的对应关系;
图5为本发明实施例一提供的一种内存空洞检测和清除的方法整体操作步骤流 程图6为本发明实施例一提供的一种内存空洞检测和清除的方法中,堆中申请成功 的内存被释放的同时,所述内存记录链表中对应的显示状态;
图7为本发明实施例一提供的一种内存空洞检测和清除的方法中,当累加和大于 等于规定阈值时,堆与所述内存记录链表中的处理结果;
图8为本发明实施例一提供的一种内存空洞检测和清除的方法中,当累加和小于 规定阈值时,堆与所述内存记录链表中的处理结果;
图9为本发明实施例一提供的一种内存空洞检测和清除的方法中,检测到内存空 洞时,堆与所述内存记录链表中的状态;
图10为本发明实施例一提供的一种内存空洞检测和清除的方法中,将堆中内存 复制到堆外的示意图11为本发明实施例一提供的一种内存空洞检测和清除的方法中,将堆中内存 被操作系统回收后,堆与所述内存记录链表中的状态;
图12为本发明实施例一提供的一种内存空洞检测和清除的方法中,堆外内存恢 复到堆中以后,堆与所述内存记录链表中的状态;
图13为本发明实施例二提供的一种内存空洞检测和清除的装置的主要装置结构 图14为本发明实施例二提供的一种内存空洞检测和清除的装置的整体装置结构 图15为本发明实施例二提供的一种内存空洞检测和清除的装置中清除单元的结 构图。
具体实施方式
下面结合附图对本发明实施例一种内存空洞检测和清除的方法和装置进行详细 描述。
实施例一
本发明实施例提供一种内存空洞检测和清除的方法,如图1所示,操作步骤包括
101、当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内 存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状态为使用;
102、当第一条内存使用记录存入内存记录链表中时,所述内存空洞检测装置启动 内存空洞检测装置中的定时器;
103、所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内 存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;
104、当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链 表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址一,和在所述 首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所述首地址一和 首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一和首 地址二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所述内存记录链表 中的第一条内存使用记录;
105、当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内 存空洞,重启定时器。
本发明实施例提供的一种内存空洞检测和清除的方法,内存空洞检测装置将进程 从堆中申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表 中,通过所述内存记录链表中的内存使用记录的状态,检测堆中的内存空洞,并将其清除。 本发明实施例解决了现有技术中,对于内存较小的设备,在经过大量的小块内存分配就会 产生内存空洞,内存不能被充分利用的问题,减少了内存空洞的出现,提高了内存的利用率。
具体应用时,在Linux和Unix操作系统中,采用内存管理器来管理内存分配。所 述内存管理器对于大于等于规定阈值(例如128k)的内存申请,直接由内核在内存区域中 申请一块独立的内存。在所述独立内存释放时,也是由所述内核将所述独立内存回收,这个 过程中不会产生内存碎块等问题,也不会影响堆的空间。而所述内存管理器对于小于规定 阈值的内存申请,操作系统直接向堆中申请内存。每次向堆中申请内存时,将堆顶向上增长 来扩展内存空间,也就是堆地址向上增长,同时向上调整堆顶指针,指向堆中最上方新申请 的内存首地址。
如果堆顶的内存还在占用,下面有很大的连续内存已经被释放,那么所述已经被 释放的连续内存都不能被操作系统回收,这就是所谓的内存空洞,如图2所示。只有当内存 管理器发现从堆顶的内存开始向下有连续内存被释放,且释放的内存的大小总和大于等于 规定阈值时,操作系统才能将所述释放内存回收,可以被再次利用,同时堆顶指针减小为指 向被操作系统回收内存以后堆中最上方还在占用的内存,如图3所示。
由于线程可以访问整个进程空间,所以在进程启动时,开辟一个线程用来运行内 存空洞检测装置,同时在堆外的内存中建立一个内存记录链表。当进程每次从堆中申请内 存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存 使用记录,其中状态为使用,将该条内存使用记录插入所述内存记录链表中,所以所述内存 记录链表的链表首为存入所述内存记录链表中的第一条内存使用记录,同时堆顶新申请成 功的内存与所述内存记录链表的链表尾的记录相对应,如图4所示,进程在堆顶新申请内 存Hl成功,在所述内存记录链表中Hl处于所述内存记录链表的链表尾。
在进程启动的同时所述内存空洞检测装置开始工作,如图5所示,操作流程如下
501、当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内 存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状态为使用。
502、当第一条内存使用记录存入内存记录链表中时,所述内存空洞检测装置启动 内存空洞检测装置中的定时器。
例如所述定时器规定的时间可设为3s,即每3s所述内存空洞检测装置进行一次 内存空洞检测。
503、所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内 存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放。
如图6所示,所述内存记录链表中的内存使用记录所显示的状态。
504、所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,判断是否 能查找出第一条状态为使用的内存使用记录;
5041、当查找出第一条状态为使用的内存使用记录时,将所述第一条状态为使用 的内存使用记录之前的所有内存使用记录中记录的内存大小进行累加,当累加和大于等于 规定阈值时,将所述内存记录链表中所述第一条状态为使用的内存使用记录之前的所有内 存使用记录删除;或者当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
其中,当累加和大于等于规定阈值时,表示这些累加过的内存处于堆的上方包括 堆顶,则这些内存已经被操作系统回收,同时堆顶指针调整为指向所述第一条状态为使用 的内存,如图7所示。当累加和小于规定阈值时,所述内存记录链表不做任何修改的同时堆顶指针也保持不变,如图8所示。
5042、当没有查找出状态为使用的内存使用记录时,将所述内存记录链表中所有 内存使用记录中记录的内存大小进行累加,当累加和大于等于规定阈值时,删除所述内存 记录链表中的所有内存使用记录;或者当累加和小于规定阈值时,对所述内存记录链表不 做任何修改。
其中,当累加和大于等于规定阈值时,删除所述内存记录链表中的所有内存使用 记录,同时堆中的内存全部被操作系统回收,堆顶指针为空。
505、当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链 表的链表首开始,分别查找第一条状态为释放的内存使用记录,和在所述查找出第一条状 态为释放的内存使用记录之后查找第一条状态为使用的内存使用记录。
5051、当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录 链表的链表首开始,没有查找出状态为释放的内存使用记录,重启定时器,并退出,等待到 达下一个所述定时器规定的时间;
5052、当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录 链表的链表首开始,查找出第一条状态为释放的内存使用记录之后没有查找出状态为使用 的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
5053、当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录 链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址三,和在所 述首地址三之后查找到的第一条状态为使用的内存使用记录中的首地址四,所述首地址三 或首地址四大于堆顶指针时,调整堆顶指针的值为所述内存记录链表的链表尾的内存使用 记录的首地址,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
5054、当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录 链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址一,和在所 述首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所述首地址一 和首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一和 首地址二之间的堆中内存区域的所有内存大小的总和。
506、判断所述内存空洞的大小是否大于等于规定阈值;
5061、当所述内存空洞的大小小于规定阈值时,重启定时器,并退出,等待到达下 一个所述定时器规定的时间;
当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空 洞,重启定时器。
如图9所示,所述首地址一为H2,所述首地址二为H4,H2和H4之间的内存区域为 所述内存空洞,大小为180k,大于规定阈值128k。
所述内存空洞检测装置清除内存空洞的具体步骤如下
5062、将从堆顶到首地址二之间的每块内存中的数据复制到堆外的对应内存块 中,每个所述堆外的对应内存块的大小均大于规定阈值,并将指向堆中的每块内存的指针 调整为所述堆外的对应内存块的首地址;
如图10所示,将从堆顶到H4之间的每块内存中的数据复制到堆外的对应内存块 中,每个所述堆外的对应内存块的大小均为200k,大于规定阈值128k,并将指向H4的指针指向N2,指向H5的指针指向NI,这样进程在使用堆中堆顶到H4区域之间的数据时,就可以 访问NI和N2,保证了数据的一致性。
507、从堆顶到首地址一之间的内存区域被操作系统回收的同时,将所述内存记录 链表中首地址一对应的内存使用记录到首地址二对应的内存使用记录之间的所有内存使 用记录删除;
这样堆顶到H2之间的区域都为已释放的,而且区域的大小已经大于128k,则这些 区域可被操作系统回收,堆顶指针调整为指向H1。同时,在所述内存记录链表中,H2对应的 内存使用记录到H4对应的内存使用记录之间的所有内存使用记录删除,但是H4对应的内 存使用记录到所述内存记录链表的链表尾的记录保持不变,以便恢复内存,如图11所示。
508、按照所述内存记录链表中从首地址二对应的内存使用记录到所述内存记录 链表的链表尾的内存使用记录的顺序,将存储于所述堆外的内存块中的数据复制到堆中的 对应内存块中,同时将所述内存记录链表中对应的内存使用记录的首地址更新为堆中对应 内存块的首地址,所述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记录 中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的对应内存块。
按照所述内存记录链表中H4对应的内存使用记录和H5对应的内存使用记录的顺 序,将存储于N2和NI的数据恢复到堆中,堆中对应内存块的大小为所述内存记录链表中首 地址H4和H5对应的内存使用记录中的大小,恢复后N2和NI的数据对应堆中对应内存块 的首地址H6和H7,同时将所述内存记录链表中对应的内存使用记录的首地址更新为堆中 对应内存块的首地址H6和H7,并将指向NI和N2的指针调整为指向堆中的H7和H6,如图 12所示。
至此,所述内存空洞清除完毕。
实施例二
本发明实施例提供一种内存空洞检测和清除的装置,如图13所示,包括记录单元 1301,启动单元1302,修改记录单元1303,检测单元1304和清除单元1305。
其中,记录单元1301,用于当进程每次从堆中申请内存成功时,内存空洞检测装 置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表 中,所述状态为使用;
启动单元1302,用于当第一条内存使用记录存入内存记录链表中时,所述内存空 洞检测装置启动内存空洞检测装置中的定时器;
修改记录单元1303,用于所述进程从堆中申请成功的内存被释放时,所述内存空 洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修 改为释放;
检测单元1304,用于当到达所述定时器规定的时间时,所述内存空洞检测装置从 所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地 址一,和在所述首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二, 所述首地址一和首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所 述首地址一和首地址二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所 述内存记录链表中的第一条内存使用记录;
清除单元1305,用于当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器。
本发明实施例提供的一种内存空洞检测和清除的装置,内存空洞检测装置将进程 从堆中申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表 中,通过所述内存记录链表中的内存使用记录的状态,检测堆中的内存空洞,并将其清除。 本发明实施例解决了现有技术中,对于内存较小的设备,在经过大量的小块内存分配就会 产生内存空洞,内存不能被充分利用的问题,减少了内存空洞的出现,提高了内存的利用 率。
本发明实施例提供一种内存空洞检测和清除的装置,如图14所示,还包括第一处 理单元1306,第二处理单元1307,第一重启处理单元1308,第二重启处理单元1309。
其中,第一处理单元1306,用于所述内存空洞检测装置从所述内存记录链表中的 链表尾开始查找,直到查找出第一条状态为使用的内存使用记录,并将所述第一条状态为 使用的内存使用记录之前的所有内存使用记录中记录的内存大小进行累加,当累加和大于 等于规定阈值时,将所述内存记录链表中所述第一条状态为使用的内存使用记录之前的所 有内存使用记录删除;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
第二处理单元1307,用于所述内存空洞检测装置从所述内存记录链表中的链表尾 开始查找,没有查找出状态为使用的内存使用记录,将所述内存记录链表中所有内存使用 记录中记录的内存大小进行累加,当累加和大于等于规定阈值时,删除所述内存记录链表 中的所有内存使用记录;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
第一重启处理单元1308,用于当到达所述定时器规定的时间时,所述内存空洞检 测装置从所述内存记录链表的链表首开始,没有查找出状态为释放的内存使用记录,重启 定时器,并退出,等待到达下一个所述定时器规定的时间。
第一重启处理单元1308还用于当到达所述定时器规定的时间时,所述内存空洞 检测装置从所述内存记录链表的链表首开始,查找出第一条状态为释放的内存使用记录之 后没有查找出状态为使用的内存使用记录,重启定时器,并退出,等待到达下一个所述定时 器规定的时间。
第一重启处理单元1308还用于当到达所述定时器规定的时间时,所述内存空洞 检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记 录中的首地址三,和在所述首地址三之后查找到的第一条状态为使用的内存使用记录中的 首地址四,所述首地址三或首地址四大于堆顶指针时,调整堆顶指针的值为所述内存记录 链表的链表尾的内存使用记录的首地址,重启定时器,并退出,等待到达下一个所述定时器 规定的时间。
第二重启处理单元1309,用于当所述内存空洞的大小小于规定阈值时,重启定时 器,并退出,等待到达下一个所述定时器规定的时间。
本发明实施例提供一种内存空洞检测和清除的装置,如图15所示,清除单元1305 包括复制模块1501,删除模块1502和恢复模块1503。
其中,复制模块1501,用于将从堆顶到首地址二之间的每块内存中的数据复制到 堆外的对应内存块中,每个所述堆外的对应内存块的大小均大于规定阈值,并将指向堆中 的每块内存的指针调整为所述堆外的对应内存块的首地址;
删除模块1502,用于从堆顶到首地址一之间的内存区域被操作系统回收的同时,将所述内存记录链表中首地址一对应的内存使用记录到首地址二对应的内存使用记录之 间的所有内存使用记录删除;
恢复模块1503,用于按照所述内存记录链表中从首地址二对应的内存使用记录到 所述内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆外的内存块中的数据 复制到堆中的对应内存块中,所述堆中的对应内存块的大小为所述内存记录链表中对应内 存使用记录中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的对应内存 块。
本装置操作过程,参见上述内存空洞检测和清除的方法的实现过程。
以上所述,仅为本发明的具体实施方式
,但本发明的保护范围并不局限于此,任何 熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵 盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
权利要求
1.一种内存空洞检测和清除的方法,其特征在于,包括当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状态为使用;当第一条内存使用记录存入内存记录链表中时,所述内存空洞检测装置启动内存空洞检测装置中的定时器;所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址一,和在所述首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所述首地址一和首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一和首地址二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所述内存记录链表中的第一条内存使用记录;当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞, 重启定时器。
2.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放之后,还包括所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,直到查找出第一条状态为使用的内存使用记录,并将所述第一条状态为使用的内存使用记录之前的所有内存使用记录中记录的内存大小进行累加;当累加和大于等于规定阈值时,将所述内存记录链表中所述第一条状态为使用的内存使用记录之前的所有内存使用记录删除;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
3.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放之后,还包括所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,没有查找出状态为使用的内存使用记录,将所述内存记录链表中所有内存使用记录中记录的内存大小进行累加;当累加和大于等于规定阈值时,删除所述内存记录链表中的所有内存使用记录;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
4.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,还包括当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,没有查找出状态为释放的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,查找出第一条状态为释放的内存使用记录之后没有查找出状态为使用的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址三,和在所述首地址三之后查找到的第一条状态为使用的内存使用记录中的首地址四,所述首地址三或首地址四大于堆顶指针时,调整堆顶指针的值为所述内存记录链表的链表尾的内存使用记录的首地址,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
5.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,还包括当所述内存空洞的大小小于规定阈值时,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
6.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,所述当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器包括将从堆顶到首地址二之间的每块内存中的数据复制到堆外的对应内存块中,每个所述堆外的对应内存块的大小均大于规定阈值,并将指向堆中的每块内存的指针调整为所述堆外的对应内存块的首地址;从堆顶到首地址一之间的内存区域被操作系统回收的同时,将所述内存记录链表中首地址一对应的内存使用记录到首地址二对应的内存使用记录之间的所有内存使用记录删除;按照所述内存记录链表中从首地址二对应的内存使用记录到所述内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆外的内存块中的数据复制到堆中的对应内存块中,同时将所述内存记录链表中对应的内存使用记录的首地址更新为堆中对应内存块的首地址,所述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记录中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的对应内存块。
7.—种内存空洞检测和清除的装置,其特征在于,包括记录单元,用于当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状态为使用;启动单元,用于当第一条内存使用记录存入内存记录链表中时,所述内存空洞检测装置启动内存空洞检测装置中的定时器;修改记录单元,用于所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;检测单元,用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址一,和在所述首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所述首地址一和首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一和首地址二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所述内存记录链表中的第一条内存使用记录;清除单元,用于当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器。
8.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括 第一处理单元,用于所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,直到查找出第一条状态为使用的内存使用记录,并将所述第一条状态为使用的内存使用记录之前的所有内存使用记录中记录的内存大小进行累加,当累加和大于等于规定阈值时,将所述内存记录链表中所述第一条状态为使用的内存使用记录之前的所有内存使用记录删除;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
9.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括 第二处理单元,用于所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,没有查找出状态为使用的内存使用记录,将所述内存记录链表中所有内存使用记录中记录的内存大小进行累加,当累加和大于等于规定阈值时,删除所述内存记录链表中的所有内存使用记录;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
10.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括 第一重启处理单元,用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,没有查找出状态为释放的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;第一重启处理单元还用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,查找出第一条状态为释放的内存使用记录之后没有查找出状态为使用的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;第一重启处理单元还用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址三,和在所述首地址三之后查找到的第一条状态为使用的内存使用记录中的首地址四, 所述首地址三或首地址四大于堆顶指针时,调整堆顶指针的值为所述内存记录链表的链表尾的内存使用记录的首地址,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
11.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括 第二重启处理单元,用于当所述内存空洞的大小小于规定阈值时,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
12.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,清除单元包括复制模块,用于将从堆顶到首地址二之间的每块内存中的数据复制到堆外的对应内存块中,每个所述堆外的对应内存块的大小均大于规定阈值,并将指向堆中的每块内存的指针调整为所述堆外的对应内存块的首地址;删除模块,用于从堆顶到首地址一之间的内存区域被操作系统回收的同时,将所述内存记录链表中首地址一对应的内存使用记录到首地址二对应的内存使用记录之间的所有内存使用记录删除;恢复模块,用于按照所述内存记录链表中从首地址二对应的内存使用记录到所述内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆外的内存块中的数据复制到堆中的对应内存块中,同时将所述内存记录链表中对应的内存使用记录的首地址更新为堆中对 应内存块的首地址,所述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记录中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的对应内存块。
全文摘要
本发明实施例公开了一种内存空洞检测和清除的方法和装置,涉及内存优化领域,减少了内存空洞的出现,提高了内存的利用率。所述方法包括当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中;所述内存空洞检测装置启动内存空洞检测装置中的定时器;所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;当到达所述定时器规定的时间时,检测内存空洞;当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器。本发明实施例主要应用在内存优化处理过程中。
文档编号G06F12/02GK102999427SQ20111027822
公开日2013年3月27日 申请日期2011年9月19日 优先权日2011年9月19日
发明者宋久元 申请人:汉王科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1