专利名称:内存泄漏检测及防止的方法
技术领域:
本发明涉及计算机系统的内存管理,尤指一种内存泄漏检测及防止的方法。
背景技术:
内存是软件运行的必需资源,内存资源不足将导致软件运行异常,系统无法提供正常功能甚至退出服务。尤其是在面向消息处理的软件架构中,各个进程之间都是通过消息进行通信的,需要为每条消息分配合适的内存块用于消息内容的缓存,并在消息发出后释放该内存块。在软件长时间运行的过程中,可能由于各种原因导致分配的内存没有释放掉,从而产生内存泄漏,累积效应可能导致系统内存总量减少以至耗尽的现象。在这种情况下,系统一般是不能自行恢复的,严重时可能导致恶性循环,系统退出服务。
针对于内存泄漏,现有技术中的解决方案,例如首先确定应用程序申请的内存块,以及所申请的不同内存块被占用的时间,在应用程序运行时,记录其申请内存块和释放内存块的信息,最后确定超过占用时间尚未释放的内存块,通过上述方法确定应用程序的内存泄露点,具体内容请参阅申请号为02121418的中国专利申请。
上述现有技术方案的实质是通过采用增加的检测模块来确定内存块的泄漏,但具有如下缺陷仅能检测到检测模块软件启动后发生的内存泄漏情况,对于检测模块软件启动前的内存泄漏无法检测;没有提供防止泄漏的措施。
发明内容
本发明解决的一个问题是提供一种内存泄漏检测的方法,有效检测内存泄漏。
本发明解决的另一个问题是提供一种内存泄漏防止的方法,有效检测内存泄漏并可以在发现内存泄漏后进行直接恢复。
相应地,本发明内存泄漏检测的方法包括设置步骤,在操作系统中,增加用于记录内存块被占用时间的时间标签;赋值步骤,内存管理模块分配内存块时,对时间标签赋值,以记录分配该内存块时的系统时间,并在对内存块访问时将时间标签的值更新为当前系统时间;检测步骤,检测内存块的时间标签;判断步骤,根据时间标签记录时间,判断内存块占用时长是否超过强制释放时间,如果超过则内存块泄漏,如果未超过,则未泄漏。
本发明内存泄漏防止的方法包括设置步骤,在操作系统中,增加用于记录内存块被占用时间的时间标签;赋值步骤,内存管理模块分配内存块时,对时间标签赋值,以记录分配该内存块时的系统时间,并在对内存块访问时将时间标签的值更新为当前系统时间;检测步骤,检测内存块的时间标签;执行步骤,根据时间标签记录时间,在内存块占用时长超过强制释放时间时,释放该内存块。
设置步骤还包括时间标签属性域设置,所述时间标签属性域用于表示时间标签的属性,进一步包括表示内存块是否有效的有效性标签和表示内存块是否为全局内存块的全局标签。时间标签及时间标签属性域通过扩展内存块的属性信息的数据结构实现。
执行步骤还包括将释放后的内存块的有效性标签设置为无效。
检测步骤和执行步骤(检测步骤和判断步骤)包括如下步骤根据有效性标签的值,判断该内存块是否有效;如果该内存块无效,则不检测该内存块的时间标签;如果该内存块有效,则根据全局标签的值,判断该内存块是否为全局内存块,如果是全局内存块,则不检测该内存块的时间标签;如果不是全局内存块,则执行检测步骤。
按检测周期执行检测步骤和执行步骤(检测步骤和判断步骤)。所述检测周期通过启动设置在内存管理模块中的周期定时器实现。
所述强制释放时间根据内存块占用最长时间预估设置。
本发明与现有技术相比,本发明具有以下优点通过对内存块增加时间标签并根据时间标签对已分配的内存块进行维护、检测和判断,内存泄漏检测方便且有效防止内存泄漏;通过有效性标签和全局标签防止误检测,排除不必要的检测;内存检测和维护可以人工启动和关闭,检测的周期可以作为系统参数进行动态调整。
图1是本发明内存泄漏检测的方法的流程图。
图2是本发明内存泄漏防止的方法的流程图。
具体实施例方式
本发明内存泄漏检测及防止的方法可以检测内存块泄漏,记录检测结果以方便问题定位和检查,再根据检测结果判断是否释放内存块;或者在发现内存块泄漏时直接进行释放恢复,防止系统恶化,提高系统长时间运行的稳定性。
系统中的消息都是有时效性的,超过一定时间未得到处理的消息是无效,其分配的内存块也就判断为泄漏,可以被释放。
请参照图1,根据所述原理,本发明内存泄漏检测的方法包括设置步骤,在操作系统中,增加用于记录内存块被占用时间的时间标签;赋值步骤,内存管理模块分配内存块时,对时间标签赋值,以记录分配该内存块时的系统时间,并在对内存块访问时将时间标签的值更新为当前系统时间;
检测步骤,检测内存块的时间标签;判断步骤,根据时间标签记录时间,判断内存块占用时长是否超过强制释放时间,如果超过则内存块泄漏,如果未超过,则未泄漏。
记录检测结果以方便问题定位和检查,再根据检测结果判断是否释放内存块,如果需要释放,则可通过操作系统API(应用编程接口)或直接修改内存块的状态为空闲实现。
同理,请参照图2所示,本发明内存泄漏防止的方法,包括设置步骤,在操作系统中,增加用于记录内存块被占用时间的时间标签;赋值步骤,内存管理模块分配内存块时,对时间标签赋值,以记录分配该内存块时的系统时间,并在对内存块访问时将时间标签的值更新为当前系统时间;检测步骤,检测内存块的时间标签;执行步骤,根据时间标签记录时间,在内存块占用时长(即当前时间与上次访问时间的时间间隔),超过强制释放时间时,释放该内存块(可以通过调用内存管理模块的接口来释放)。
所述强制释放时间根据内存块占用最长时间预估设置所述赋值步骤中,内存块是由应用模块在需要时向操作系统的内存管理模块申请的,内存管理模块响应申请并分配内存块,内存块申请成功后,应用模块就可以对这个分配的内存块进行访问(读/写)操作,在读写操作时,应用模块需要同时调用内存管理模块提供的接口更新内存块的时间标签为当前系统时间。实时操作系统本身是有一个时间系统的,记录的时间以操作系统的时间为基准计算。
在操作系统中还增加设置时间标签属性,用于表示时间标签的属性,进一步包括表示内存块是否有效的有效性标签和表示内存块是否全局内存块的全局标签。在操作系统中,每个内存块都有一个数据结构保存该内存块的属性信息,如起始地址、内存块大小等,时间标签和时间标签属性域通过扩展内存块的属性信息的数据结构实现,即增加时间标签和时间标签属性域就是在这个数据结构中增加两个元素,标识该内存块的占用时间。有效性标签和全局标签同时间标签都是内存块的一个属性。
有效性标签就是一个标识符,例如取值为是(1)或者否(0)(否标识该内存块不是有效内存,在内存管理模块扫描时不需要检测和判断时间标签;是标识该内存块是有效内存,在内存管理模块扫描时需要检测和判断时间标签,如果时间标签太老则要强制释放该内存)。释放后(或者检测出内存块泄漏)的内存块的时间标签属性设置为无效,例如可设置为最大值,全F。
全局标签类似有效性标签,标识该内存块是否全局,例如取值是(1)或者否(0)(是标识该内存块是全局内存块,在内存管理模块扫描时不需要检测和判断时间标签;否标识该内存块不是全局内存块,在内存管理模块扫描时需要检测和判断时间标签,如果时间标签太老则要强制释放该内存)。
所述检测步骤和执行步骤(检测步骤和判断步骤)之间还包括如下步骤根据有效性标签的值,判断该内存块是否有效;如果该内存块无效,则不检测该内存块的时间标签;如果该内存块有效,则根据全局标签的值,判断该内存块是否为全局内存块;如果是全局内存块,则不检测该内存块的时间标签(由于全局内存块是指在系统运行过程中一直存在,不会被释放的内存块,所以不需要检测);如果不是全局内存块,则执行检测步骤。
所述检测步骤和执行步骤(检测步骤和判断步骤)按检测周期执行。所述检测周期通过启动设置在内存管理模块中的周期定时器实现。检测周期是可以调整的,例如在调测中发现当前的周期太短或者太长,可以通过这个功能来进行调整,否则可能要重新修改代码,编译程序,这样可以提高调试测试的效率;并且对于不同的应用系统,可能需要不同的检测周期,这样可以针对不同的系统来灵活的设定检测周期。实现一般的应用系统都有一个调试测试接口,通过这个接口可以向系统发送命令,调整检测周期可以利用这个接口来向系统发送一条命令来实现。检测也可以人工启动和关闭,并且检测周期可以作为系统参数调整。
本发明在运行过程中通过对内存块的管理,提供方便的内存泄漏检测,有效的防止内存泄漏,能够自动进行纠正,这不需要人工干预,能够降低系统崩溃的概率,提高系统的可靠性,在内存泄漏发生后自动进行恢复。
权利要求
1.一种内存泄漏检测的方法,其特征在于,包括设置步骤,在操作系统中,增加用于记录内存块被占用时间的时间标签;赋值步骤,内存管理模块分配内存块时,对时间标签赋值,以记录分配该内存块时的系统时间,并在对内存块访问时将时间标签的值更新为当前系统时间;检测步骤,检测内存块的时间标签;判断步骤,根据时间标签记录时间,判断内存块占用时长是否超过强制释放时间,如果超过则内存块泄漏,如果未超过,则未泄漏。
2.如权利要求1所述的内存泄漏检测的方法,其特征在于,设置步骤还包括时间标签属性域设置,所述时间标签属性域用于表示时间标签的属性,进一步包括表示内存块是否有效的有效性标签和表示内存块是否为全局内存块的全局标签。
3.如权利要求2所述的内存泄漏检测的方法,其特征在于,时间标签及时间标签属性域通过扩展内存块的属性信息的数据结构实现。
4.如权利要求2所述的内存泄漏检测的方法,其特征在于,检测步骤和判断步骤之间还包括根据有效性标签的值,判断该内存块是否有效;如果该内存块无效,则不检测该内存块的时间标签;如果该内存块有效,则根据全局标签的值,判断该内存块是否为全局内存块,如果是全局内存块,则不检测该内存块的时间标签;如果不是全局内存块,则执行检测步骤。
5.如权利要求1至4任一项所述的内存泄漏检测的方法,其特征在于,强制释放时间根据内存块占用最长时间预估设置。
6.如权利要求1至4任一项所述的内存泄漏检测的方法,其特征在于,按检测周期执行检测步骤和判断步骤。
7.一种内存泄漏防止的方法,其特征在于,包括设置步骤,在操作系统中,增加用于记录内存块被占用时间的时间标签;赋值步骤,内存管理模块分配内存块时,对时间标签赋值,以记录分配该内存块时的系统时间,并在对内存块访问时将时间标签的值更新为当前系统时间;检测步骤,检测内存块的时间标签;执行步骤,根据时间标签记录时间,在内存块占用时长超过强制释放时间时,释放该内存块。
8.如权利要求7所述的内存泄漏防止的方法,其特征在于,设置步骤还包括时间标签属性域设置,所述时间标签属性域用于表示时间标签的属性,进一步包括表示内存块是否有效的有效性标签和表示内存块是否为全局内存块的全局标签。
9.如权利要求8所述的内存泄漏防止的方法,其特征在于,时间标签及时间标签属性域通过扩展内存块的属性信息的数据结构实现。
10.如权利要求8所述的内存泄漏防止的方法,其特征在于,执行步骤还包括将释放后的内存块的有效性标签设置为无效。
11.如权利要求10所述的内存泄漏防止的方法,其特征在于,检测步骤和执行步骤之间还包括如下步骤根据有效性标签的值,判断该内存块是否有效;如果该内存块无效,则不检测该内存块的时间标签;如果该内存块有效,则根据全局标签的值,判断该内存块是否为全局内存块,如果是全局内存块,则不检测该内存块的时间标签;如果不是全局内存块,则执行检测步骤。
12.如权利要求7至11任一项所述的内存泄漏防止的方法,其特征在于,按检测周期执行检测步骤和执行步骤。
13.如权利要求12所述的内存泄漏防止的方法,其特征在于,所述检测周期通过启动设置在内存管理模块中的周期定时器实现。
14.如权利要求7至11任一项所述的内存泄漏防止的方法,其特征在于,强制释放时间根据内存块占用最长时间预估设置。
全文摘要
本发明公开一种内存泄漏检测及防止的方法,包括设置步骤,在操作系统中,增加用于记录内存块被占用时间的时间标签;赋值步骤,内存管理模块分配内存块时,对时间标签赋值,以记录分配该内存块时的系统时间,并在对内存块访问时将时间标签的值更新为当前系统时间;检测步骤,检测内存块的时间标签;判断步骤,根据时间标签记录时间,判断内存块占用时长是否超过强制释放时间,如果超过则内存块泄漏,如果未超过,则未泄漏。可以根据检测结果判断是否释放内存块,也可以在检测到泄漏时直接释放。这样,检测方便且有效防止内存泄漏。
文档编号G06F11/36GK1845080SQ20051006326
公开日2006年10月11日 申请日期2005年4月7日 优先权日2005年4月7日
发明者余明 申请人:华为技术有限公司