CN102999427A - 内存空洞检测和清除的方法和装置 - Google Patents
内存空洞检测和清除的方法和装置 Download PDFInfo
- Publication number
- CN102999427A CN102999427A CN2011102782264A CN201110278226A CN102999427A CN 102999427 A CN102999427 A CN 102999427A CN 2011102782264 A CN2011102782264 A CN 2011102782264A CN 201110278226 A CN201110278226 A CN 201110278226A CN 102999427 A CN102999427 A CN 102999427A
- Authority
- CN
- China
- Prior art keywords
- memory
- internal memory
- record
- chained list
- address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Memory System (AREA)
Abstract
本发明实施例公开了一种内存空洞检测和清除的方法和装置,涉及内存优化领域,减少了内存空洞的出现,提高了内存的利用率。所述方法包括:当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中;所述内存空洞检测装置启动内存空洞检测装置中的定时器;所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;当到达所述定时器规定的时间时,检测内存空洞;当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器。本发明实施例主要应用在内存优化处理过程中。
Description
技术领域
本发明涉及内存优化领域,尤其涉及一种内存空洞检测和清除的方法和装置。
背景技术
在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,用于按照所述内存记录链表中从首地址二对应的内存使用记录到所述内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆外的内存块中的数据复制到堆中的对应内存块中,所述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记录中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的对应内存块。
本装置操作过程,参见上述内存空洞检测和清除的方法的实现过程。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (12)
1.一种内存空洞检测和清除的方法,其特征在于,包括:
当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状态为使用;
当第一条内存使用记录存入内存记录链表中时,所述内存空洞检测装置启动内存空洞检测装置中的定时器;
所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址一,和在所述首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所述首地址一和首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一和首地址二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所述内存记录链表中的第一条内存使用记录;
当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器。
2.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放之后,还包括:
所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,直到查找出第一条状态为使用的内存使用记录,并将所述第一条状态为使用的内存使用记录之前的所有内存使用记录中记录的内存大小进行累加;
当累加和大于等于规定阈值时,将所述内存记录链表中所述第一条状态为使用的内存使用记录之前的所有内存使用记录删除;
当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
3.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放之后,还包括:
所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,没有查找出状态为使用的内存使用记录,将所述内存记录链表中所有内存使用记录中记录的内存大小进行累加;
当累加和大于等于规定阈值时,删除所述内存记录链表中的所有内存使用记录;
当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
4.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,还包括:
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,没有查找出状态为释放的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,查找出第一条状态为释放的内存使用记录之后没有查找出状态为使用的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;
当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址三,和在所述首地址三之后查找到的第一条状态为使用的内存使用记录中的首地址四,所述首地址三或首地址四大于堆顶指针时,调整堆顶指针的值为所述内存记录链表的链表尾的内存使用记录的首地址,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
5.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,还包括:
当所述内存空洞的大小小于规定阈值时,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
6.根据权利要求1所述的一种内存空洞检测和清除的方法,其特征在于,所述当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器包括:
将从堆顶到首地址二之间的每块内存中的数据复制到堆外的对应内存块中,每个所述堆外的对应内存块的大小均大于规定阈值,并将指向堆中的每块内存的指针调整为所述堆外的对应内存块的首地址;
从堆顶到首地址一之间的内存区域被操作系统回收的同时,将所述内存记录链表中首地址一对应的内存使用记录到首地址二对应的内存使用记录之间的所有内存使用记录删除;
按照所述内存记录链表中从首地址二对应的内存使用记录到所述内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆外的内存块中的数据复制到堆中的对应内存块中,同时将所述内存记录链表中对应的内存使用记录的首地址更新为堆中对应内存块的首地址,所述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记录中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的对应内存块。
7.一种内存空洞检测和清除的装置,其特征在于,包括:
记录单元,用于当进程每次从堆中申请内存成功时,内存空洞检测装置将所述申请成功的内存的首地址、大小和状态作为一条内存使用记录存入内存记录链表中,所述状态为使用;
启动单元,用于当第一条内存使用记录存入内存记录链表中时,所述内存空洞检测装置启动内存空洞检测装置中的定时器;
修改记录单元,用于所述进程从堆中申请成功的内存被释放时,所述内存空洞检测装置将所述内存记录链表中与所述被释放的内存对应的内存使用记录中的状态修改为释放;
检测单元,用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址一,和在所述首地址一之后查找到的第一条状态为使用的内存使用记录中的首地址二,所述首地址一和首地址二之间的堆中内存区域为内存空洞,其中所述内存空洞的大小为所述首地址一和首地址二之间的堆中内存区域的所有内存大小的总和,所述链表首为存入所述内存记录链表中的第一条内存使用记录;
清除单元,用于当所述内存空洞的大小大于等于规定阈值时,所述内存空洞检测装置清除内存空洞,重启定时器。
8.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括:
第一处理单元,用于所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,直到查找出第一条状态为使用的内存使用记录,并将所述第一条状态为使用的内存使用记录之前的所有内存使用记录中记录的内存大小进行累加,当累加和大于等于规定阈值时,将所述内存记录链表中所述第一条状态为使用的内存使用记录之前的所有内存使用记录删除;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
9.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括:
第二处理单元,用于所述内存空洞检测装置从所述内存记录链表中的链表尾开始查找,没有查找出状态为使用的内存使用记录,将所述内存记录链表中所有内存使用记录中记录的内存大小进行累加,当累加和大于等于规定阈值时,删除所述内存记录链表中的所有内存使用记录;当累加和小于规定阈值时,对所述内存记录链表不做任何修改。
10.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括:
第一重启处理单元,用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,没有查找出状态为释放的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;
第一重启处理单元还用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,查找出第一条状态为释放的内存使用记录之后没有查找出状态为使用的内存使用记录,重启定时器,并退出,等待到达下一个所述定时器规定的时间;
第一重启处理单元还用于当到达所述定时器规定的时间时,所述内存空洞检测装置从所述内存记录链表的链表首开始,分别查找出第一条状态为释放的内存使用记录中的首地址三,和在所述首地址三之后查找到的第一条状态为使用的内存使用记录中的首地址四,所述首地址三或首地址四大于堆顶指针时,调整堆顶指针的值为所述内存记录链表的链表尾的内存使用记录的首地址,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
11.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,还包括:
第二重启处理单元,用于当所述内存空洞的大小小于规定阈值时,重启定时器,并退出,等待到达下一个所述定时器规定的时间。
12.根据权利要求7所述的一种内存空洞检测和清除的装置,其特征在于,清除单元包括:
复制模块,用于将从堆顶到首地址二之间的每块内存中的数据复制到堆外的对应内存块中,每个所述堆外的对应内存块的大小均大于规定阈值,并将指向堆中的每块内存的指针调整为所述堆外的对应内存块的首地址;
删除模块,用于从堆顶到首地址一之间的内存区域被操作系统回收的同时,将所述内存记录链表中首地址一对应的内存使用记录到首地址二对应的内存使用记录之间的所有内存使用记录删除;
恢复模块,用于按照所述内存记录链表中从首地址二对应的内存使用记录到所述内存记录链表的链表尾的内存使用记录的顺序,将存储于所述堆外的内存块中的数据复制到堆中的对应内存块中,同时将所述内存记录链表中对应的内存使用记录的首地址更新为堆中对应内存块的首地址,所述堆中的对应内存块的大小为所述内存记录链表中对应内存使用记录中的大小,并将指向所述堆外的内存块的指针调整为指向所述堆中的对应内存块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110278226.4A CN102999427B (zh) | 2011-09-19 | 2011-09-19 | 内存空洞检测和清除的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110278226.4A CN102999427B (zh) | 2011-09-19 | 2011-09-19 | 内存空洞检测和清除的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102999427A true CN102999427A (zh) | 2013-03-27 |
CN102999427B CN102999427B (zh) | 2015-06-17 |
Family
ID=47928024
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110278226.4A Active CN102999427B (zh) | 2011-09-19 | 2011-09-19 | 内存空洞检测和清除的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102999427B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104281537A (zh) * | 2013-07-05 | 2015-01-14 | 阿里巴巴集团控股有限公司 | 一种内存复制方法及装置 |
CN104731661A (zh) * | 2015-03-02 | 2015-06-24 | 大唐移动通信设备有限公司 | 一种回收泄露的程序运行资源的方法及装置 |
CN106294059A (zh) * | 2015-06-26 | 2017-01-04 | 中兴通讯股份有限公司 | 网管系统中进程的恢复方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101141225A (zh) * | 2006-09-08 | 2008-03-12 | 中兴通讯股份有限公司 | 一种移动通讯系统中数据丢失处理方法 |
US7472237B1 (en) * | 2002-10-28 | 2008-12-30 | Netapp, Inc. | Apparatus to offload and accelerate pico code processing running in a storage processor |
CN101968795A (zh) * | 2010-09-03 | 2011-02-09 | 清华大学 | 一种数据块长度可变的文件系统缓存方法 |
CN102063385A (zh) * | 2010-12-23 | 2011-05-18 | 深圳市金宏威实业发展有限公司 | 一种内存管理方法和系统 |
-
2011
- 2011-09-19 CN CN201110278226.4A patent/CN102999427B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7472237B1 (en) * | 2002-10-28 | 2008-12-30 | Netapp, Inc. | Apparatus to offload and accelerate pico code processing running in a storage processor |
CN101141225A (zh) * | 2006-09-08 | 2008-03-12 | 中兴通讯股份有限公司 | 一种移动通讯系统中数据丢失处理方法 |
CN101968795A (zh) * | 2010-09-03 | 2011-02-09 | 清华大学 | 一种数据块长度可变的文件系统缓存方法 |
CN102063385A (zh) * | 2010-12-23 | 2011-05-18 | 深圳市金宏威实业发展有限公司 | 一种内存管理方法和系统 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104281537A (zh) * | 2013-07-05 | 2015-01-14 | 阿里巴巴集团控股有限公司 | 一种内存复制方法及装置 |
CN104281537B (zh) * | 2013-07-05 | 2017-09-08 | 阿里巴巴集团控股有限公司 | 一种内存复制方法及装置 |
CN104731661A (zh) * | 2015-03-02 | 2015-06-24 | 大唐移动通信设备有限公司 | 一种回收泄露的程序运行资源的方法及装置 |
CN104731661B (zh) * | 2015-03-02 | 2018-12-14 | 大唐移动通信设备有限公司 | 一种回收泄露的程序运行资源的方法及装置 |
CN106294059A (zh) * | 2015-06-26 | 2017-01-04 | 中兴通讯股份有限公司 | 网管系统中进程的恢复方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102999427B (zh) | 2015-06-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102222046B (zh) | 一种磨损均衡方法及装置 | |
CN102508785B (zh) | 一种磨损均衡方法及装置 | |
CN106484323A (zh) | 一种固态存储的损耗均衡方法及系统 | |
CN102521269B (zh) | 一种基于索引的计算机连续数据保护方法 | |
CN108431783B (zh) | 访问请求处理方法、装置及计算机系统 | |
CN104484283B (zh) | 一种降低固态硬盘写放大的方法 | |
CN101556589A (zh) | 一种Oracle在数据库中定期淘汰过期数据的方法 | |
CN103473296A (zh) | 一种适用于云计算的回收站机制及其系统 | |
US8966200B1 (en) | Pruning free blocks out of a decremental backup chain | |
CN102999427B (zh) | 内存空洞检测和清除的方法和装置 | |
EP2919119B1 (en) | Systems and methods for reducing database load time | |
CN102231137B (zh) | 一种数据存储系统及方法 | |
CN107797772A (zh) | 一种基于闪存介质的垃圾回收系统及方法 | |
CN101206656B (zh) | 文件安全删除系统及方法 | |
CN106919471A (zh) | 用于快照建立的方法和系统 | |
CN106649146A (zh) | 一种内存释放方法及装置 | |
CN103268291A (zh) | 在闪存存储系统中延迟持久化索引元数据的方法 | |
CN106648457A (zh) | 更新反向映射元数据的方法及装置 | |
CN105653466B (zh) | 数据储存装置以及快闪存储器控制方法 | |
CN105740098A (zh) | 备份数据中过期数据的判定方法及系统 | |
CN103077118A (zh) | 一种无效数据回收方法及系统 | |
CN105528302B (zh) | 一种基于逻辑卷的动态管理磁盘的方法及系统 | |
CN107229427B (zh) | 一种文件存储方法、系统及计算机存储介质 | |
CN111324289B (zh) | 一种存储器 | |
CN103246567A (zh) | 用于目标跟踪内存管理的队列方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |