G06F12/02
1.一种内存空洞检测和清除的方法,其特征在于,包括:
当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申 请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存 记录链表中,所述状态为使用;
当第一条内存使用记录存入内存记录链表中时,所述内存空洞检 测装置启动内存空洞检测装置中的定时器;
所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装 置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中 的状态修改为释放;
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述 内存记录链表的链表首开始,分别查出第一条状态为释放的内存使 用记录中的首地址一,和在所述首地址一之后查到的第一条状态为 使用的内存使用记录中的首地址二,所述首地址一和首地址二之间的 堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一 和首地址二之间的堆中内存区域的所有内存大小的总和,所述链表首 为存入所述内存记录链表中的第一条内存使用记录;
当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测 装置清除内存空洞,重启定时器。
2.根据权利要求1所述的一种内存空洞检测和清除的方法,其特 征在于,所述进程从堆中申请成功的内存被释放时,所述内存空洞检 测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记 录中的状态修改为释放之后,还包括:
所述内存空洞检测装置从所述内存记录链表中的链表尾开始查 ,直到查出第一条状态为使用的内存使用记录,并将所述第一条 状态为使用的内存使用记录之前的所有内存使用记录中记录的内存大 小进行累加;
当累加和大于等于规定阈值时,将所述内存记录链表中所述第一 条状态为使用的内存使用记录之前的所有内存使用记录删除;
当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
3.根据权利要求1所述的一种内存空洞检测和清除的方法,其特 征在于,所述进程从堆中申请成功的内存被释放时,所述内存空洞检 测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记 录中的状态修改为释放之后,还包括:
所述内存空洞检测装置从所述内存记录链表中的链表尾开始查 ,没有查出状态为使用的内存使用记录,将所述内存记录链表中 所有内存使用记录中记录的内存大小进行累加;
当累加和大于等于规定阈值时,删除所述内存记录链表中的所有 内存使用记录;
当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
4.根据权利要求1所述的一种内存空洞检测和清除的方法,其特 征在于,还包括:
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述 内存记录链表的链表首开始,没有查出状态为释放的内存使用记录, 重启定时器,并退出,等待到达下一个所述定时器规定的时间;
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述 内存记录链表的链表首开始,查出第一条状态为释放的内存使用记 录之后没有查出状态为使用的内存使用记录,重启定时器,并退出, 等待到达下一个所述定时器规定的时间;
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述 内存记录链表的链表首开始,分别查出第一条状态为释放的内存使 用记录中的首地址三,和在所述首地址三之后查到的第一条状态为 使用的内存使用记录中的首地址四,所述首地址三或首地址四大于堆 顶指针时,调整堆顶指针的值为所述内存记录链表的链表尾的内存使 用记录的首地址,重启定时器,并退出,等待到达下一个所述定时器 规定的时间。
5.根据权利要求1所述的一种内存空洞检测和清除的方法,其特 征在于,还包括:
当所述内存空洞的大小小于规定阈值时,重启定时器,并退出, 等待到达下一个所述定时器规定的时间。
6.根据权利要求1所述的一种内存空洞检测和清除的方法,其特 征在于,所述当所述内存空洞的大小大于等于规定阈值时,所述内存 空洞检测装置清除内存空洞,重启定时器包括:
将从堆顶到首地址二之间的每块内存中的数据复制到堆外的对应 内存块中,每个所述堆外的对应内存块的大小均大于规定阈值,并将 指向堆中的每块内存的指针调整为所述堆外的对应内存块的首地址;
从堆顶到首地址一之间的内存区域被操作系统回收的同时,将所 述内存记录链表中首地址一对应的内存使用记录到首地址二对应的内 存使用记录之间的所有内存使用记录删除;
按照所述内存记录链表中从首地址二对应的内存使用记录到所述 内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆外的 内存块中的数据复制到堆中的对应内存块中,同时将所述内存记录链 表中对应的内存使用记录的首地址更新为堆中对应内存块的首地址, 所述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记 录中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中 的对应内存块。
7.一种内存空洞检测和清除的装置,其特征在于,包括:
记录单元,用于当进程每次从堆中申请内存成功时,内存空洞检 测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使 用记录存入内存记录链表中,所述状态为使用;
启动单元,用于当第一条内存使用记录存入内存记录链表中时, 所述内存空洞检测装置启动内存空洞检测装置中的定时器;
修改记录单元,用于所述进程从堆中申请成功的内存被释放时, 所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对 应的内存使用记录中的状态修改为释放;
检测单元,用于当到达所述定时器规定的时间时,所述内存空洞 检测装置从所述内存记录链表的链表首开始,分别查出第一条状态 为释放的内存使用记录中的首地址一,和在所述首地址一之后查到 的第一条状态为使用的内存使用记录中的首地址二,所述首地址一和 首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小 为所述首地址一和首地址二之间的堆中内存区域的所有内存大小的总 和,所述链表首为存入所述内存记录链表中的第一条内存使用记录;
清除单元,用于当所述内存空洞的大小大于等于规定阈值时,所 述内存空洞检测装置清除内存空洞,重启定时器。
8.根据权利要求7所述的一种内存空洞检测和清除的装置,其特 征在于,还包括:
第一处理单元,用于所述内存空洞检测装置从所述内存记录链表 中的链表尾开始查,直到查出第一条状态为使用的内存使用记录, 并将所述第一条状态为使用的内存使用记录之前的所有内存使用记录 中记录的内存大小进行累加,当累加和大于等于规定阈值时,将所述 内存记录链表中所述第一条状态为使用的内存使用记录之前的所有内 存使用记录删除;当累加和小于规定阈值时,对所述内存记录链表不 做任何修改。
9.根据权利要求7所述的一种内存空洞检测和清除的装置,其特 征在于,还包括:
第二处理单元,用于所述内存空洞检测装置从所述内存记录链表 中的链表尾开始查,没有查出状态为使用的内存使用记录,将所 述内存记录链表中所有内存使用记录中记录的内存大小进行累加,当 累加和大于等于规定阈值时,删除所述内存记录链表中的所有内存使 用记录;当累加和小于规定阈值时,对所述内存记录链表不做任何修 改。
10.根据权利要求7所述的一种内存空洞检测和清除的装置,其 特征在于,还包括:
第一重启处理单元,用于当到达所述定时器规定的时间时,所述 内存空洞检测装置从所述内存记录链表的链表首开始,没有查出状 态为释放的内存使用记录,重启定时器,并退出,等待到达下一个所 述定时器规定的时间;
第一重启处理单元还用于当到达所述定时器规定的时间时,所述 内存空洞检测装置从所述内存记录链表的链表首开始,查出第一条 状态为释放的内存使用记录之后没有查出状态为使用的内存使用记 录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;
第一重启处理单元还用于当到达所述定时器规定的时间时,所述 内存空洞检测装置从所述内存记录链表的链表首开始,分别查出第 一条状态为释放的内存使用记录中的首地址三,和在所述首地址三之 后查到的第一条状态为使用的内存使用记录中的首地址四,所述首 地址三或首地址四大于堆顶指针时,调整堆顶指针的值为所述内存记 录链表的链表尾的内存使用记录的首地址,重启定时器,并退出,等 待到达下一个所述定时器规定的时间。
11.根据权利要求7所述的一种内存空洞检测和清除的装置,其 特征在于,还包括:
第二重启处理单元,用于当所述内存空洞的大小小于规定阈值时, 重启定时器,并退出,等待到达下一个所述定时器规定的时间。
12.根据权利要求7所述的一种内存空洞检测和清除的装置,其 特征在于,清除单元包括:
复制模块,用于将从堆顶到首地址二之间的每块内存中的数据复 制到堆外的对应内存块中,每个所述堆外的对应内存块的大小均大于 规定阈值,并将指向堆中的每块内存的指针调整为所述堆外的对应内 存块的首地址;
删除模块,用于从堆顶到首地址一之间的内存区域被操作系统回 收的同时,将所述内存记录链表中首地址一对应的内存使用记录到首 地址二对应的内存使用记录之间的所有内存使用记录删除;
恢复模块,用于按照所述内存记录链表中从首地址二对应的内存 使用记录到所述内存记录链表的链表尾的内存使用记录的顺序,将存 储于所述堆外的内存块中的数据复制到堆中的对应内存块中,同时将 所述内存记录链表中对应的内存使用记录的首地址更新为堆中对应内 存块的首地址,所述堆中的对应内存块的大小为所述内存记录链表中 对应内存使用记录中的大小,并将指向所述堆外的内存块的指针调整 为指向所述堆中的对应内存块。
本发明涉及内存优化领域,尤其涉及一种内存空洞检测和清除的 方法和装置。
在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所示,进程在堆顶新申请内存H1成功,在所 述内存记录链表中H1处于所述内存记录链表的链表尾。
在进程启动的同时所述内存空洞检测装置开始工作,如图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的指针指向N1, 这样进程在使用堆中堆顶到H4区域之间的数据时,就可以访问N1和 N2,保证了数据的一致性。
507、从堆顶到首地址一之间的内存区域被操作系统回收的同时, 将所述内存记录链表中首地址一对应的内存使用记录到首地址二对应 的内存使用记录之间的所有内存使用记录删除;
这样堆顶到H2之间的区域都为已释放的,而且区域的大小已经大 于128k,则这些区域可被操作系统回收,堆顶指针调整为指向H1。同 时,在所述内存记录链表中,H2对应的内存使用记录到H4对应的内存 使用记录之间的所有内存使用记录删除,但是H4对应的内存使用记录 到所述内存记录链表的链表尾的记录保持不变,以便恢复内存,如图 11所示。
508、按照所述内存记录链表中从首地址二对应的内存使用记录到 所述内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆 外的内存块中的数据复制到堆中的对应内存块中,同时将所述内存记 录链表中对应的内存使用记录的首地址更新为堆中对应内存块的首地 址,所述堆中的对应内存块的大小为所述内存记录链表中对应内存使 用记录中的大小,并将指向所述堆外的内存块的指针调整为指向所述 堆中的对应内存块。
按照所述内存记录链表中H4对应的内存使用记录和H5对应的内 存使用记录的顺序,将存储于N2和N1的数据恢复到堆中,堆中对应 内存块的大小为所述内存记录链表中首地址H4和H5对应的内存使用 记录中的大小,恢复后N2和N1的数据对应堆中对应内存块的首地址 H6和H7,同时将所述内存记录链表中对应的内存使用记录的首地址更 新为堆中对应内存块的首地址H6和H7,并将指向N1和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,用于按照所述内存记录链表中从首地址二对应的 内存使用记录到所述内存记录链表的链表尾的内存使用记录的顺序, 将存储于所述堆外的内存块中的数据复制到堆中的对应内存块中,所 述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记录 中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的 对应内存块。
本装置操作过程,参见上述内存空洞检测和清除的方法的实现过 程。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并 不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范 围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。 因此,本发明的保护范围应所述以权利要求的保护范围为准。
本文发布于:2023-04-14 12:56:00,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/1/87176.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |