具体实施方式
以下参照附图对本发明中的内存泄漏检测方法进行说明。
需要说明的是,以下的各实施例中,将主要以内存块链的内存管理结构为例对本发明的技术方案展开详细描述。本领域技术人员应当了解,在现有技术中,系统也使用其它模式对内存进行管理。因此,本领据技术人员根据本文中的描述,可以不经创造性劳动的将本发明的技术方案应用于内存块链以外的其它内存管理结构,而这种应用必然落入随附权利要求书的保护范围中。
图2示出了根据本发明的一个具体实施例的内存泄漏检测方法的流程图。以下参照图2对本发明的第一方面进行的第一实施例进行详细描述。
在步骤S1中,根据内存块的长度将分配给进程的内存块划分多个内存类,分别记录每个所述内存类的内存块申请信息和内存块释放信息,以及每个内存块的地址信息。具体的,可以先划分内存类,继而借助建立内存统计表的方法完成信息统计。
本领域技术人员应当理解,本发明的技术方案通过对不同内存块分类后,以类为单位进行信息统计以实现快速定位内存泄漏点的目的。可以理解,这种方法相较现有技术中需要对进程使用的内存块逐一进行检测更为高效。优选的,可以通过内存块长度对内存进行分类。一些现有的内存分配方案会将根据内存块长度将内存块组合为多个内存块链。在内存泄漏检测中,使用同样的内存块长度分类方案对内存块进行分类,可以使程序设计更加简单,有利于程序语言的优化组织。优选的,可以以2n byte为单位对内存块长度进行分类,即将长度在2n-1至2n Byte之间的内存块归于同一类。
接着,基于上述确定的分类建立内存统计表。内存统计表中应当按类表明该类内存块的内存块申请信息和内存块释放信息。优选的,内存块申请信息为该类内存块的申请次数,内存块释放信息为该类内存块的内存块释放次数,内存块地址信息为当前内存块占用的地址信息。上述内存统计表的一个示意性的例子如表1所示:
表1:一个内存统计表
内存类(单位:byte) |
内存块申请次数 |
内存块释放次数 |
内存块地址信息 |
0-16 |
46 |
34 |
[1][25]...[235] |
16-32 |
27 |
16 |
[23][35]...[121] |
32-64 |
14 |
13 |
[2][51]...[232] |
64-128 |
3 |
3 |
|
128-256 |
6 |
6 |
[6][16]...[26] |
256-1024 |
45 |
44 |
[4][42]...[79] |
1024-2048 |
27 |
27 |
[11][38]...[41] |
2048-4096 |
5 |
5 |
|
4096-8192 |
14 |
14 |
|
8192-16k |
7 |
7 |
|
16k-32k |
37 |
30 |
[8][15]...[66] |
32k-64k |
45 |
43 |
[5][88]...[98] |
>64k |
5 |
4 |
[7][38][65][235] |
表1中的每一行代表一个确定类的相关信息。例如,内存块长度小于等于16byte的被计入第一行;长度大于16byte小于等于32byte的内存块计入第二行,以此类推。在本实施例中,假设进程[1]提出申请12byte内存块的请求。首先,基于长度,将其归入0-16byte一类。接着,在进程得到所需内存块后,在内存列表中将对应该类的内存块申请次数加一,同时将进程号[1]记入对应的地址信息一栏中(如表1所示)。当进程[1]任务结束正常完成内存块归还后,则将内存块释放次数加1。同时将对应的进程号[1]从内存块地址信息一栏中删除。
本例中,通过进程号[1]应当可以对应到进程[1]所申请的内存块的地址信息。应当理解,“内存块地址信息”一栏中,可以直接记录每个进程所申请内存块的物理地址,也可以记录其他可以对应到该内存块的物理地址的相关信息,例如该内存块对应的逻辑地址,进程标识号等其它信息。
在步骤S2中,基于内存统计表中的信息,确定内存泄露点。优选的,本实施例中通过比较每个内存类的内存块申请次数和内存块释放次数确定可能发生内存泄漏的内存类,然后进一步确定该内存类中的内存泄漏点。具体的,如图3所示,步骤S2还可以分为步骤S20和步骤S21两个子步骤。
首先,在步骤S20中,以类为单位,基于内存块申请信息和内存块释放信息确定待查内存块。如果同一个内存类中的内存块申请次数与内存块释放次数相同,并且内存块地址信息中没有信息保留,则认为进程所申请的该类中的内存块都已经被正常释放,没有出现内存泄漏,因此无须进一步检测。以表1为例,其中内存块长度处于64-128 byte,2048-4096 byte,4096-8192 byte,8192-16k byte之间的4个内存类的内存块申请次数与内存块释放次数相同,因此,无需对这4个内存类进一步确定内存泄漏点。而将余下的其他内存类中的内存块确定为待查内存块。
在完成待查内存块确定后,在步骤S21中,分别对每个待查内存块进行检查,进一步确定其中是否存在内存泄漏点。具体确定方法为本领域的成熟技术手段,例如,通过查找该内存块对应的进程是否存在,或记录该内存块在一定时间内是否被读取等技术手段,此处不再一一赘述。
优选的,在步骤S21中还可以设置选择条件,并且只对满足选择条件的代查内存块作进一步确定,判断其中是否存在内存泄漏点,以提高查找内存泄漏点的效率。举例来说,可以将选择条件设置为:只对长度大于第一预定值的代查内存块进行检查,确定内存泄漏点。以表1为例,如果第一预定值为32k,那么只需检查长度大于32k-64k和>64k的两个内存类即可。第一预定值的选择应当根据系统的具体情况确定。当CPU空闲率较高而内存空间相对紧张时,应当设置较小的第一预定值,从而使得尽可能都得被占用内存块被检查,以找出更多的内存泄漏点。反之,如果内存空间余量较大,而CPU的占用率较高,可以将第一预定值设置得较大,只对长度较大的待查内存块进行检查,从而相对减少对CPU的占用保证其他进程顺利完成。上述选择条件也可以设置为:对占用时间大于第二预定值的待查内存块进行检查,确定内存泄漏点。该占用时间是指待查内存块对应的当前进程所占用的时间。具体的,需要对每个内存块的占用时间进行记录。占用时间可以被记录在内存统计表中,也可以一一对应于内存块保存在内存统计表中的其他信息,例如进程号或地址信息。如果该第二预定值为2小时,则只对占用时间大于两小时的待查内存块进行检查。本领域技术人员应当理解,所谓内存泄漏的不良影响就在于造成一些内存区不再被使用又未被释放。因此,发生真正内存泄漏的待查内存块往往被占用时间较长。优选的,第二预定值的时间长度应当小于内存泄漏检测的周期。无疑这种针对内存块者占用时间的选择条件设置可以缩短找到内存泄漏点的时间,提高系统效率。上述针对待查内存块长度和待查内存块占用时间的选择条件可以分别使用,也可以结合使用。本领域技术人员理解,选择条件的设置目的在于提高检测内存泄漏点的效率,因此其具体设置包括但不限于上文中所给出的示例。
图4示出了根据本发明的一个具体实施例的内存泄漏检测方法的流程图。以下参照图4对本发明的第一方面进行的第二实施例进行详细描述。
在步骤S1中,根据内存块的物理地址将分配给进程的内存块划分多个内存类,分别记录每个所述内存类的内存块申请信息和内存块释放信息,以及每个内存块的地址信息。具体的,可以先划分内存类,继而借助建立内存统计表的方法完成信息统计。具体的,可以结合内存的物理结构进行分类。例如,对于SDRAM或DDR结构的内存,可以按内存区块(bank)分为一类。在内存分类表中,将存储在同一bank中的内存块归为同一类。同理,也可以将使用同一行(row)进行存储的内存块归为同一内存类。这样划分的优势在于,可以在完成同一类内存泄漏点查找后,统一对其中需要释放的内存块进行释放,减少了对控制线的选择次数。
接着,基于上述确定的分类建立内存统计表并执行步骤S2’。其具体操作步骤与第一实施例中对应的步骤相同,此处不再赘述。需要说明的是,本发明的关键在于通过对内存块分类,再根据确定的内存类进行统计的方法寻找内存泄漏点。其中,用于确定分类的参数包括但不限于内存块长度及内存块的物理地址。
图5示出了根据本发明的一个具体实施例的内存泄漏检测装置的框图。以下参照图5对本发明的第二方面进行的第三实施例进行详细描述。其中,内存泄漏检测装置1包括信息统计装置10和泄漏点确定装置11。
信息统计装置10根据内存块的长度将分配给进程的内存块划分多个内存类,分别记录每个所述内存类的内存块申请信息和内存块释放信息,以及每个内存块的地址信息。具体的,可以先划分内存类,继而借助建立内存统计表的方法完成信息统计。
本领域技术人员应当理解,本发明的技术方案通过对不同内存块分类后,以类为单位进行信息统计以实现快速定位内存泄漏点的目的。可以理解,这种方法相较现有技术中需要对进程使用的内存块逐一进行检测更为高效。优选的,信息统计装置10可以通过内存块长度对内存进行分类。一些现有的内存分配方案会将根据内存块长度将内存块组合为多个内存块链。在内存泄漏检测中,使用同样的内存块长度分类方案对内存块进行分类,可以使程序设计更加简单,有利于程序语言的优化组织。优选的,可以以2n byte为单位对内存块长度进行分类,即将长度在2n-1至2n Byte之间的内存块归于同一类。
信息统计装置10可以进一步基于上述确定的分类建立内存统计表。内存统计表中应当按类表明该类内存块的内存块申请信息和内存块释放信息。优选的,内存块申请信息为该类内存块的申请次数,内存块释放信息为该类内存块的内存块释放次数,内存块地址信息为当前内存块占用的地址信息。上述内存统计表的一个示意性的例子如表1所示:
表1:一个内存统计表
内存类(单位:byte) |
内存块申请次数 |
内存块释放次数 |
内存块地址信息 |
0-16 |
46 |
34 |
[1][25]...[235] |
16-32 |
27 |
16 |
[23][35]...[121] |
32-64 |
14 |
13 |
[2][51]...[232] |
64-128 |
3 |
3 |
|
128-256 |
6 |
6 |
[6][16]...[26] |
256-1024 |
45 |
44 |
[4][42]...[79] |
1024-2048 |
27 |
27 |
[11][38]...[41] |
2048-4096 |
5 |
5 |
|
4096-8192 |
14 |
14 |
|
8192-16k |
7 |
7 |
|
16k-32k |
37 |
30 |
[8][15]...[66] |
32k-64k |
45 |
43 |
[5][88]...[98] |
>64k |
5 |
4 |
[7][38][65][235] |
表1中的每一行代表一个确定类的相关信息。例如,内存块长度小于等于16byte的被计入第一行;长度大于16byte小于等于32byte的内存块计入第二行,以此类推。在本实施例中,假设进程[1]提出申请12byte内存块的请求。首先,基于长度,将其归入0-16byte一类。接着,在进程得到所需内存块后,在内存列表中将对应该类的内存块申请次数加一,同时将进程号[1]记入对应的地址信息一栏中(如表1所示)。当进程[1]任务结束正常完成内存块归还后,则将内存块释放次数加1。同时将对应的进程号[1]从内存块地址信息一栏中删除。
本例中,通过进程号[1]应当可以对应到进程[1]所申请的内存块的地址信息。应当理解,“内存块地址信息”一栏中,可以直接记录每个进程所申请内存块的物理地址,也可以记录其他可以对应到该内存块的物理地址的相关信息,例如该内存块对应的逻辑地址,进程标识号等其它信息。
泄漏点确定装置11用于基于内存统计表中的信息,确定内存泄露点。优选的,本实施例中通过比较每个内存类的内存块申请次数和内存块释放次数确定可能发生内存泄漏的内存类,然后进一步确定该内存类中的内存泄漏点。具体的,如图4所示,泄漏点确定装置11还进一步包括待查内存块确定装置110和检查装置111两个子装置。
待查内存块确定装置110用于以类为单位,基于内存块申请信息和内存块释放信息确定待查内存块。如果同一个内存类中的内存块申请次数与内存块释放次数相同,并且内存块地址信息中没有信息保留,则认为进程所申请的该类中的内存块都已经被正常释放,没有出现内存泄漏,因此无须进一步检测。以表1为例,其中内存块长度处于64-128byte,2048-4096 byte,4096-8192 byte,8192-16k byte之间的4个内存类的内存块申请次数与内存块释放次数相同,因此,无需对这4个内存类进一步确定内存泄漏点。而将余下的其他内存类中的内存块确定为待查内存块。
在完成待查内存块确定后,检查装置111分别对每个待查内存块进行检查,进一步确定其中是否存在内存泄漏点。具体确定方法为本领域的成熟技术手段,例如,通过查找该内存块对应的进程是否存在,或记录该内存块在一定时间内是否被读取等技术手段,此处不再一一赘述。
优选的,待查内存块确定装置110还可以被用于设置选择条件,并且只对满足选择条件的代查内存块作进一步确定,判断其中是否存在内存泄漏点,以提高查找内存泄漏点的效率。举例来说,可以将选择条件设置为:只对长度大于第一预定值的代查内存块进行检查,确定内存泄漏点。以表1为例,如果第一预定值为32k,那么只需检查长度大于32k-64k和>64k的两个内存类即可。第一预定值的选择应当根据系统的具体情况确定。当CPU空闲率较高而内存空间相对紧张时,应当设置较小的第一预定值,从而使得尽可能都得被占用内存块被检查,以找出更多的内存泄漏点。反之,如果内存空间余量较大,而CPU的占用率较高,可以将第一预定值设置得较大,只对长度较大的待查内存块进行检查,从而相对减少对CPU的占用保证其他进程顺利完成。上述选择条件也可以设置为:对占用时间大于第二预定值的待查内存块进行检查,确定内存泄漏点。该占用时间是指待查内存块对应的当前进程所占用的时间。具体的,需要对每个内存块的占用时间进行记录。占用时间可以被记录在内存统计表中,也可以一一对应于内存块保存在内存统计表中的其他信息,例如进程号或地址信息。如果该第二预定值为2小时,则只对占用时间大于两小时的待查内存块进行检查。本领域技术人员应当理解,所谓内存泄漏的不良影响就在于造成一些内存区不再被使用又未被释放。因此,发生真正内存泄漏的待查内存块往往被占用时间较长。优选的,第二预定值的时间长度应当小于内存泄漏检测的周期。无疑这种针对内存块者占用时间的选择条件设置可以缩短找到内存泄漏点的时间,提高系统效率。上述针对待查内存块长度和待查内存块占用时间的选择条件可以分别使用,也可以结合使用。本领域技术人员理解,选择条件的设置目的在于提高检测内存泄漏点的效率,因此其具体设置包括但不限于上文中所给出的示例。
上述实施里还拥有变化例,即本发明的第二方面第四实施例。下文将结合图5对第四实施例进行详细描述。其中,内存泄漏检测装置1同样可以包括信息统计装置10和泄漏点确定装置11。
信息统计装置10用于根据内存块的物理地址将分配给进程的内存块划分多个内存类,分别记录每个所述内存类的内存块申请信息和内存块释放信息,以及每个内存块的地址信息。具体的,可以先划分内存类,继而借助建立内存统计表的方法完成信息统计。具体的,可以结合内存的物理结构进行分类。例如,对于SDRAM或DDR结构的内存,可以按内存区块(bank)进行分类。在内存分类表中,将存储在同一个bank中的内存块归为同一类。同理,也可以将同一行(row)的内存块归为同一内存类。这样划分的优势在于,可以在完成同一类内存泄漏点查找后,统一对其中需要释放的内存块进行释放,减少了对控制线的选择次数。
信息统计装置10的其余结构和用途,以及泄漏点确定装置11的具体结构用途与第四实施例中相应的装置对应,此处不再赘述。需要说明的是,本发明的关键在于通过对内存块分类,再根据确定的内存类进行统计的方法寻找内存泄漏点。其中,用于确定分类的参数包括但不限于内存块长度及内存块的物理地址。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在所附权利要求的范围内做出各种变形或修改。