发明内容
本发明要解决的技术问题在于针对现有技术中检测内存泄漏的方法单一,没有形成一套完善的检测内存泄漏的方法的缺陷,提供一种较完善的检测内存泄漏的方法及系统。
本发明解决其技术问题所采用的技术方案是:
提供一种检测内存泄漏的方法,包括以下步骤:
S1、读取内存基本信息;
S2、判断所读取的内存基本信息是否正确;
S3、在所述内存基本信息正确时,根据所读取的内存基本信息,通过代码走读的方式来判断内存占用量是否持续增长;
S4、在所述内存占用量持续增长时,获取内存分配和释放的函数调用数据;
S5、根据所述函数调用数据获知每一块内存的生命周期,定位内存泄漏。
本发明所述的检测内存泄漏的方法中,步骤S1具体包括:
S11、在开机时,读取POST界面和BIOS下的内存容量;
S12、在dos下利用光盘版Memtest运行测试50次以上,读取内存容量和频率;
S13、在RED Hat 5.4和Suse10系统中读取内存容量;
S14、在linux系统下运行STRESS 48小时以上,并读取内存基本信息;
S15、在Windows系统中读取内存容量;
S16、运行everest ultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;
S17、反复运行压力测试工具24小时以上,读取所述内存基本信息。
本发明所述的检测内存泄漏的方法中,在所述内存基本信息正确时,还包括步骤:
读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再判断内存的大小是否持续增长。
本发明所述的检测内存泄漏的方法中,在步骤S1之前还包括步骤:
S0、对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。
本发明解决其技术问题所采用的另一技术方案是:
提供一种检测内存泄漏的系统,包括:
内存信息读取模块,用于读取内存基本信息;
第一判断模块,用于判断所述内存信息读取模块所读取的内存基本信息是否正确;
第二判断模块,用于在所述第一判断模块的判断结果为所述内存基本信息正确时,根据所述内存信息读取模块所读取的内存基本信息,通过代码走读的方式来判断内存占用量是否持续增长;
函数调用数据获取模块,用于在所述第二判断模块的判断结果为所述内存占用量持续增长时,获取内存分配和释放的函数调用数据;
内存泄漏定位模块,用于根据所述函数调用数据获取模块获取的所述函数调用数据获知每一块内存的生命周期,定位内存泄漏。
本发明所述的检测内存泄漏的系统中,所述第二判断模块通过代码走读的方式来判断所述内存占用量是否持续增长。
本发明所述的检测内存泄漏的系统中,所述内存信息读取模块包括:
第一读取子模块,用于在开机时,读取POST界面和BIOS下的内存容量;
第二读取子模块,用于在dos下利用光盘版Memtest运行测试50次以上,读取内存容量和频率;
第三读取子模块,用于在RED Hat 5.4和Suse10系统中读取内存容量;
第四读取子模块,用于在linux系统下运行STRESS 48小时以上,并读取内存基本信息;
第五读取子模块,用于在Windows系统中读取内存容量;
第六读取子模块,用于运行everest ultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;
第七读取子模块,用于反复运行压力测试工具24小时以上,读取所述内存基本信息。
本发明所述的检测内存泄漏的系统中,该系统还包括:
性能测试模块,用于在所述第一判断模块的判断结果为所述内存基本信息正确时,读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再进入所述第二判断模块执行。
本发明所述的检测内存泄漏的系统中,该系统还包括:
物理测试模块,用于对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。
本发明产生的有益效果是:本发明通过代码走读的方式来判断内存占用量是否持续增长来确定是否发生内存泄漏,当发生内存泄漏时通过获取内存分配和释放的函数调用数据获知每一块内存的生命周期来迅速定位内存泄漏,从而提供了一种静态检查和动态检测相结合的检测内存泄漏的方法,更完善、有效地对内存泄漏进行测试。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,本发明实施例检测内存泄漏的方法,主要包括以下步骤:
S1、读取内存基本信息,内存基本信息包括内存名称、制造商、特性、内存容量、内存占用量、存取速率以及存取类型等比本信息;
S2、判断所读取的内存基本信息是否正确;
S3、在内存基本信息正确时,根据所读取的内存基本信息,判断内存占用量是否持续增长;可通过代码走读的方式来判断内存占用量持续增长。内存泄漏可通过代码检查即代码走读来发现和定位,也可以用专用的工具来测试和定位。实际上,对于内存泄漏,代码检查有时能比采用任何技术解决方案更快地找到问题所在。预防内存泄漏的唯一方法就是要求程序员在程序结束时,必须将每个申请的内存都释放。
S4、在内存占用量持续增长时,获取内存分配和释放的函数调用数据;一般说来,一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长的。根据这样的基本假设,持续地获取系统运行时使用的内存的大小,如果内存占用量持续地增长,则说明系统存在内存泄漏。
S5、根据函数调用数据获知每一块内存的生命周期,定位内存泄漏。一旦知道确实发生了内存泄漏,就需要更专业的工具来查明为什么会发生泄漏。在这个时候,通常需要使用一些开销较低的工具来监控和查找内存泄漏。查找内存泄漏的工具很多,这些工具提供了记录并检查所有内存分配的调试版堆栈,从而有利于分析内存泄漏和悬挂指针。每当应用程序成功的分配一块内存后,就把它的指针加入一个全局的list(序列)中;每当释放一块内存,再把它的指针从list中删除。这样,当程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存,根据函数调用数据获知每一块内存的生命周期,从而可以找到那些没有被释放的内存,即可定位内存泄漏。
进一步地,本发明实施例检测内存泄漏的方法中,步骤S1主要在以下情况下读取内存的基本数据,具体包括:
S11、在开机时,读取POST(接通电源后,系统将执行一个自我检查的例行程序)界面和BIOS(BIOS:Basic Input Output System即基本输入输出系统)下的内存容量;
S12、在dos下利用光盘版Memtest(内存压力检测软件)运行测试50次以上,读取内存容量和频率;ECC(ECC:Error Correcting Code,即错误检查和纠正技术)支持是否都已经正确识别,测试完成后注意是否有错误,如有错误,应检查内存是否有对应插槽安装好,然后再检查内存金手指及内存上的硬件是否有问题,如有问题应跟供应商取得联系。假如内存本身没有问题,应该从主板,硬盘等其他硬件上给予检查。;
S13、分别安装RED Hat 5.4和Suse10系统,观察安装过程是否正常,并在RED Hat 5.4和Suse10系统中读取内存容量;
S14、在linux系统下运行STRESS(STRESS是适用于linux系统下的内存压力测试软件)48小时以上,检测系统是否有报错,并读取内存基本信息;如有错误,应检查内存是否有对应插槽安装好,然后再检查内存金手指及内存上的硬件是否有问题,如有问题应跟供应商取得联系。假如内存本身没有问题,应该从主板,硬盘等其他硬件上给予检查。
S15、在Windows系统中,如Windows3中读取内存容量;
S16、运行everest ultimate软件读取内存各种信息,该软件可以显示内存各种信息包括内存容量、存取类型、存取速度和频率;
S17、反复运行压力测试工具(如SPEEDY+绞肉机,绞肉机也叫ETD,一种适用于windows系统下的压力测试软件,SPEEDY也是适用于windows系统下的压力测试软件,两种软件结合同时测试效果比较好)24小时以上,读取内存基本信息。同时还可以运行REBOOT软件测试,重启100次以上,观察是否有错误发生,如有错误,应检查内存是否有对应插槽安装好,然后再检查内存金手指及内存上的硬件是否有问题,如有问题应跟供应商取得联系。假如内存本身没有问题,应该从主板,硬盘等其他硬件上给予检查。
进一步地,本发明实施例检测内存泄漏的方法中,在内存基本信息正确时,还包括步骤:
读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再判断内存的大小是否持续增长。如在Windows系统下使用passmark软件测试内存各种性能,passmark为适用于windows下的测试内存性能并给出报告的软件;或者在Windows系统下使用SisoftwareSandra(适用于windows下的检测软件,可更详细地对内存的带宽,延时和缓存进行检测并给出报告)对待测内存进行其带宽、延时、缓存等性能的检测;或者使用stream软件(适用于linux系统下的内存性能报告软件)在RED Hat 5.4系统下测试内存性能,其中,RED Hat 5.4为一种linux系统。在以上各项测试均无错误产生,则测试通过,内存无泄漏。
进一步地,本发明实施例检测内存泄漏的方法中,在步骤S1之前还包括步骤:
S0、对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。包括:检查内存上各元件焊接是否牢固,是否有漏焊,虚焊现象;检查芯片组丝印内容是否完整清晰;检查PCB板或原件是否有破损,划伤;主板插满内存,测试在内存插拔过程中内存插槽是否过松或者过紧。
如图2所示,本发明实施例检测内存泄漏的系统包括内存信息读取模块10、第一判断模块20、第二判断模块30、函数调用数据获取模块40和内存泄漏定位模块50。其中,
内存信息读取模块10,用于读取内存基本信息;内存基本信息包括内存名称、制造商、特性、内存容量、内存占用量、存取速率以及存取类型等比本信息;
第一判断模块20,用于判断内存信息读取模块10所读取的内存基本信息是否正确;
第二判断模块30,用于在第一判断模块20的判断结果为内存基本信息正确时,根据内存信息读取模块所读取的内存基本信息,判断内存占用量是否持续增长;本发明实施例检测内存泄漏的系统中,第二判断模块30可通过代码走读的方式来判断内存占用量是否持续增长。内存泄漏可通过代码检查即代码走读来发现和定位,也可以用专用的工具来测试和定位。实际上,对于内存泄漏,代码检查有时能比采用任何技术解决方案更快地找到问题所在。一般说来,一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长的。根据这样的基本假设,持续地获取系统运行时使用的内存的大小,如果内存占用量持续地增长,则说明系统存在内存泄漏。
函数调用数据获取模块40,用于在第二判断模块30的判断结果为内存占用量持续增长时,获取内存分配和释放的函数调用数据;
内存泄漏定位模块50,用于根据函数调用数据获取模块40获取的函数调用数据获知每一块内存的生命周期,定位内存泄漏。每当应用程序成功的分配一块内存后,就把它的指针加入一个全局的list(序列)中;每当释放一块内存,再把它的指针从list中删除。这样,当程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存,根据函数调用数据获知每一块内存的生命周期,从而可以找到那些没有被释放的内存,即可定位内存泄漏。
预防内存泄漏的唯一方法就是要求程序员在程序结束时,必须将每个申请的内存都释放。
本发明实施例检测内存泄漏的系统中,如图3所示,内存信息读取模块10包括:
第一读取子模块11,用于在开机时,读取POST界面和BIOS下的内存容量;
第二读取子模块12,用于在dos下利用光盘版Memtest运行测试50次以上,且最好保证50次测试均通过,并读取内存容量和频率;
第三读取子模块13,用于在RED Hat 5.4和Suse10系统中读取内存容量;
第四读取子模块14,用于在linux系统下运行STRESS 48小时以上,并读取内存基本信息;
第五读取子模块15,用于在Windows系统中读取内存容量;
第六读取子模块16,用于运行everest ultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;
第七读取子模块17,用于反复运行压力测试工具24小时以上,读取内存基本信息。
本发明实施例检测内存泄漏的系统中,如图3所示,该系统还包括:
性能测试模块60,用于在第一判断模块20的判断结果为内存基本信息正确时,读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再进入执行第二判断模块30。如在Windows系统下使用passmark软件测试内存各种性能;或者在Windows系统下使用Sisoftware Sandra对待测内存进行其带宽、延时、缓存等性能的检测;或者使用stream软件在RED Hat 5.4系统下测试内存性能。在以上各项测试均无错误产生,则测试通过,内存无泄漏。
本发明实施例检测内存泄漏的系统中,如图3所示,该系统还包括:
物理测试模块70,用于对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。包括:检查内存上各元件焊接是否牢固,是否有漏焊,虚焊现象;检查芯片组丝印内容是否完整清晰;检查PCB板或原件是否有破损,划伤;主板插满内存,测试在内存插拔过程中内存插槽是否过松或者过紧。
本发明通过代码走读的方式来判断内存占用量是否持续增长来确定是否发生内存泄漏,当发生内存泄漏时通过获取内存分配和释放的函数调用数据获知每一块内存的生命周期来迅速定位内存泄漏,从而提供了一种静态检查和动态检测相结合的检测内存泄漏的方法,更完善、有效地对内存泄漏进行测试。本发明进一步地进行物理兼容性测试和内存性能测试,从而从多个方面对内存进行检测,适合批量检测。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。