一种堆内存管理方法及装置与流程

文档序号:24751626发布日期:2021-04-20 23:44阅读:79来源:国知局
一种堆内存管理方法及装置与流程

1.本发明涉及堆内存管理技术领域,尤其涉及一种堆内存管理方法及装置。


背景技术:

2.堆内存允许程序在运行时动态地申请某个大小的内存空间,为程序的设计、运行提供了便利,许多计算机处理系统会涉及到堆内存。堆内存中需要频繁地进行内存块的分配和释放,那么堆内存的管理便是随之而来的问题。由于程序运行时每次都必须用地址连续的内存,所以堆内存每次也会分配一个地址连续的内存块。
3.对于较大的一段内存,直接将其分配出去会造成大量的内存浪费。为了保证堆内存充分利用,切分多个小段内存,便可以多次分配。但随着堆内存使用的次数增多,整个堆内存可能会出现多块连续但较小的内存,这些内存空间由于较小,成为碎片化的内存,很难作为内存块分配运行程序,这些碎片化的又积少成多,使得堆内存一部分空间被浪费,这就是堆内存的碎片化问题。目前堆内存的碎片化较为普遍,亟待解决。


技术实现要素:

4.本发明提供一种堆内存管理方法及装置,解决了现有技术中堆内存的碎片化的问题。
5.第一方面,本发明提供一种堆内存管理方法,包括:获取空闲内存块链表;所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的;
6.按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块;所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块;
7.若所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,则将所述第一目标内存块作为分配的内存块。
8.上述方法下,所述空闲内存块链表任一结点存储了该结点对应内存块的大小,且按预设规则排列,那么通过预设顺序可以查找到所述各结点对应内存块的大小,确定堆内存中的第一目标内存块,从而所述第一目标内存块是内存空间最接近所述待分配内存空间的内存块,且第一目标内存块的空间足够分配,如果所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,说明所述第一目标内存块额外的分配空间小于设定的第一阈值内,且不至于切分后额外的内存成为碎片化的内存,从而缓解了堆内存的碎片化现象。
9.可选的,若所述第一差值不小于第二阈值,则将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块;所述第二阈值大于所述第一阈值;所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值;
10.将所述第一子目标内存块作为分配的内存块。
11.上述方法中,由于所述第二阈值大于所述第一阈值,若所述第一差值不小于第二阈值,说明堆内存除第一目标内存块之外的内存大于设定的所述第二阈值,仍然可以作为后续使用,不至于切分后成为碎片化的内存。
12.可选的,若所述第一差值大于所述第一阈值且小于第二阈值,则按照所述预设顺序查找所述各结点对应内存块的大小,确定所述堆内存中的第二目标内存块;所述第二目标内存块为:所述堆内存中与待分配内存空间的第二差值不小于所述第二阈值的最小内存块;
13.将所述第二目标内存块作为所述第一目标内存块,返回将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块的步骤。
14.上述方法中,若所述第一差值大于所述第一阈值且小于第二阈值,说明切分后的空间虽然不至于碎片化,但又难以作为后续使用,所以可以按照所述预设顺序查找所述各结点对应内存块的大小,直至查找到第二目标内存块,作为第一目标内存块,从而可以使得所述第一目标内存块切分后也不至于碎片化。
15.可选的,所述第一子目标内存块的空间等于所述待分配内存空间。
16.上述方式下,可以最大化利用堆内存空间,使得剩余的第二子目标内存块最大。
17.可选的,所述预设规则具体为:按照所述各结点对应的内存块大小排列所述各结点的顺序。
18.可选的,当所述各结点的顺序为按照所述各结点对应的内存块大小从大到小排列时,所述预设顺序具体为从所述空闲内存块链表的尾结点依次向首结点查找;
19.当所述各结点的顺序为按照所述各结点对应的内存块大小从小到大排列时,所述预设顺序具体为从所述空闲内存块链表的首结点依次向尾结点查找。
20.上述方式下,无论所述各结点的顺序按对应的内存块大小从大到小或者从小到大排列时,都从所述空闲内存块链表所对应内存块大小从小到大查找,尽块查找到第一差值不大于第一阈值的第一目标内存块,作为分配的内存块。
21.可选的,获取内存块总链表;所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小;
22.针对所述内存块总链表任一结点,在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并该结点的内存块、所述前一结点的内存块和\或所述后一结点的内存块,从而更新所述内存块总链表。
23.上述方式下,所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小,那么在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并内存块,从而使得合并后结点的内存块更大。
24.第二方面,本发明提供一种堆内存管理装置,包括:获取模块,用于获取空闲内存块链表;所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的;
25.查找模块,用于按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块;所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块;
26.处理模块,用于若所述第一目标内存块的空间与所述待分配内存空间的第一差值
不大于第一阈值,则将所述第一目标内存块作为分配的内存块。
27.可选的,所述处理模块还用于:
28.若所述第一差值不小于第二阈值,则将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块;所述第二阈值大于所述第一阈值;所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值;
29.将所述第一子目标内存块作为分配的内存块。
30.可选的,所述处理模块还用于:
31.若所述第一差值大于所述第一阈值且小于第二阈值,则按照所述预设顺序查找所述各结点对应内存块的大小,确定所述堆内存中的第二目标内存块;所述第二目标内存块为:所述堆内存中与待分配内存空间的第二差值不小于所述第二阈值的最小内存块;
32.将所述第二目标内存块作为所述第一目标内存块,返回将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块的步骤。
33.可选的,所述第一子目标内存块的空间等于所述待分配内存空间。
34.可选的,所述预设规则具体为:按照所述各结点对应的内存块大小排列所述各结点的顺序。
35.可选的,当所述各结点的顺序为按照所述各结点对应的内存块大小从大到小排列时,所述预设顺序具体为从所述空闲内存块链表的尾结点依次向首结点查找;
36.当所述各结点的顺序为按照所述各结点对应的内存块大小从小到大排列时,所述预设顺序具体为从所述空闲内存块链表的首结点依次向尾结点查找。
37.可选的,所述获取模块还用于:获取内存块总链表;所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小;所述处理模块还用于:针对所述内存块总链表任一结点,在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并该结点的内存块、所述前一结点的内存块和\或所述后一结点的内存块,从而更新所述内存块总链表。
38.上述第二方面及第二方面各个可选装置的有益效果,可以参考上述第一方面及第一方面各个可选方法的有益效果,这里不再赘述。
39.第三方面,本发明提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
40.第四方面,本发明提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
41.本发明的这些方面或其他方面在以下实施例的描述中会更加简明易懂。
附图说明
42.为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
43.图1为本发明实施例提供的一种堆内存管理方法对应的流程示意图;
44.图2为本发明实施例提供的一种堆内存管理方法对应的内存分配流程示意图;
45.图3为本发明实施例提供的一种堆内存管理方法对应的内存释放流程示意图;
46.图4为本发明实施例提供的一种堆内存管理装置的结构示意图。
具体实施方式
47.为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
48.如图1所示,本发明实施例提供一种堆内存管理方法。
49.步骤101:获取空闲内存块链表。
50.所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的。
51.步骤102:按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块。
52.所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块。
53.步骤103:若所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,则将所述第一目标内存块作为分配的内存块。
54.需要说明的是,所述预设规则可以根据具体场景设置,如按照所述各结点对应的内存块大小排列所述各结点的顺序,根据所述各结点对应的内存块标识排列所述各结点的顺序,或者随机排列所述各结点。
55.值得一提的是,无论所述各结点如何排列,并不改变第一目标内存块的结果,所述堆内存中不小于待分配内存空间的最小内存块,预设规则和预设顺序如何只影响查找到第一目标内存块的效率。
56.一种可选实施方式中,所述预设规则具体为:按照所述各结点对应的内存块大小排列所述各结点的顺序。
57.举例来说,待分配内存空间为120kb,第一阈值为20kb,空闲内存块链表包括:空闲结点1,对应内存块大小70kb;空闲结点2,对应内存块大小128kb;空闲结点3,对应内存块大小220kb;空闲结点4,对应内存块大小500kb;空闲内存块链表中各结点的排列顺序依次为:空闲结点1;空闲结点2;空闲结点3;空闲结点4;空闲内存块链表中各结点的排列顺序也可以依次为:空闲结点4;空闲结点3;空闲结点2;空闲结点1。
58.显然,第一目标内存块为空闲结点2对应的内存块,内存块大小为128kb,且第一差值为8kb,不大于第一阈值20kb,所以将空闲结点2对应的内存块分配给所述待分配内存空间。
59.一种可选实施方式中,当所述各结点的顺序为按照所述各结点对应的内存块大小从大到小排列时,所述预设顺序具体为从所述空闲内存块链表的尾结点依次向首结点查找;当所述各结点的顺序为按照所述各结点对应的内存块大小从小到大排列时,所述预设顺序具体为从所述空闲内存块链表的首结点依次向尾结点查找。
60.举例来说,空闲内存块链表中各结点的排列顺序依次为:空闲结点1;空闲结点2;
空闲结点3;空闲结点4;所述预设顺序具体为从首结点依次向尾结点查找,即空闲结点1;空闲结点2;空闲结点3;空闲结点4。
61.另一种可能的情形中,空闲内存块链表中各结点的排列顺序也可以依次为:空闲结点4;空闲结点3;空闲结点2;空闲结点1;所述预设顺序具体为从尾结点依次向首结点查找,即空闲结点1;空闲结点2;空闲结点3;空闲结点4,所以还可以从小往大找,尽快找到第一目标内存块。
62.上述方式下,无论所述各结点的顺序按对应的内存块大小从大到小或者从小到大排列时,都从所述空闲内存块链表所对应内存块大小从小到大查找,尽快查找到第一差值不大于第一阈值的第一目标内存块,作为分配的内存块。
63.步骤101~步骤103的方式下,若所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,那么所述第一目标内存块是内存空间最接近所述待分配内存空间的内存块,且第一目标内存块的空间足够分配,如果所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,不至于空间浪费,也不必切分,从而缓解了堆内存的碎片化现象。
64.一种可选实施方式中,若所述第一差值不小于第二阈值,则将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块;所述第二阈值大于所述第一阈值;所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值;
65.将所述第一子目标内存块作为分配的内存块。
66.如待分配的空间为130kb,那么所述第一目标内存块为空闲结点3对应的内存块,内存块大小为220kb,则第一差值为90kb,第二阈值为80kb,可以将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块。
67.所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值,所以既够所述待分配内存空间分配,又不至于浪费,使得差值不大于所述第一阈值。
68.具体来说,还可以设置切分后的第二子目标内存块的大小不小于第二阈值,这样可以保证切分后的第二子目标内存块还能作为较大的内存块继续分配。
69.上述方法中,由于所述第二阈值大于所述第一阈值,若所述第一差值不小于第二阈值,说明堆内存除第一目标内存块之外的内存大于设定的所述第二阈值,仍然可以作为后续使用,不至于切分后成为碎片化的内存。
70.需要说明的是,所述第一子目标内存块的空间可以等于所述待分配内存空间。
71.上述方式下,可以最大化利用堆内存空间,使得剩余的第二子目标内存块最大。
72.进一步地,一种可选实施方式中,若所述第一差值大于所述第一阈值且小于第二阈值,则按照所述预设顺序查找所述各结点对应内存块的大小,确定所述堆内存中的第二目标内存块;所述第二目标内存块为:所述堆内存中与待分配内存空间的第二差值不小于所述第二阈值的最小内存块。
73.举例来说,如待分配的空间为150kb,那么所述第一目标内存块为空闲结点3对应的内存块,内存块大小为220kb,则第一差值为70kb,大于第一阈值20kb,但又小于第二阈值为80kb,直接分配导致空间浪费不在可接受范围第一阈值内,但切分后,剩余的内存块也不在可接受范围,所以可以继续查找,直到查找到所述第二目标内存块。
74.将所述第二目标内存块作为所述第一目标内存块,返回将所述第一目标内存块切
分为第一子目标内存块和第二子目标内存块的步骤。
75.上述方法中,若所述第一差值大于所述第一阈值且小于第二阈值,说明切分后的空间虽然不至于碎片化,但又难以作为后续使用,所以可以按照所述预设顺序查找所述各结点对应内存块的大小,直至查找到第二目标内存块,作为第一目标内存块,从而可以使得所述第一目标内存块切分后也不至于碎片化。
76.可选的,获取内存块总链表;所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小;
77.针对所述内存块总链表任一结点,在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并该结点的内存块、所述前一结点的内存块和\或所述后一结点的内存块,从而更新所述内存块总链表。
78.上述方式下,所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小,那么在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并内存块,从而使得合并后结点的内存块更大。
79.下面结合图2,详细描述本发明实施例提供的一种堆内存管理方法对应的内存分配流程。
80.堆内存中每个内存块都包含一个管理用的数据头,数据头中包含预设标志位,通过每个内存块的预设标志位可以指示确定该内存块是否被分配。
81.堆内存中未分配内存块通过一个空闲内存块链表维护,堆内存维护内存块空闲链表将空闲内存块按大小顺序从小到大排列。
82.当分配内存块时,可以从空闲内存块链表的表头开始依次查找,直至查找到合适大小内存块(第一目标内存块),查找到内存块大小不小于要申请的大小。
83.若查找到内存块大小与申请大小相当(不大于第一阈值),则直接将查找到内存块分配给申请应用;若找到的内存块大小较大(不小于第二阈值),则把找到的内存块分裂成a内存块和b内存块(a内存块大小与申请大小相同)。
84.a内存块给申请者使用,b内存块挂在空闲链表上,分配后再次将内存块空闲链表排序。由于空闲内存链表上内存块有序按从小到大排列,这样尽可能的避免了分配时查找到的是大尺寸内存块,进而减少了分配时内存块的分裂,减少了内存碎片化,保证后续内存申请能够申请到合适的内存。
85.下面结合图3,详细描述本发明实施例提供的一种堆内存管理方法对应的内存释放流程。
86.释放内存块时,首先将待释放内存块的预设标志位置为未使用。
87.并判断前后内存块是否未使用,若未使用则将待释放内存块与前一内存块或后一内存块融为一块内存,并将其按内存块的大小有序插入空闲内存块链表,保证插入后内存块空闲链表是有序排列。
88.若待释放内存块不能与前一内存块或后一内存块融合则直接将其有序插入空闲内存块链表,释放结束。
89.此种堆内存申请及释放方法将系统内存块空闲链表有序排列,在保证内存块申请及释放时有序遍历的同时,减少内存块使用过程中碎片化,保证应用能申请到合适大小内存块,极大提高系统稳定性。
90.如图4所示,本发明提供一种堆内存管理装置,包括:获取模块401,用于获取空闲内存块链表;所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的;
91.查找模块402,用于按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块;所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块;
92.处理模块403,用于若所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,则将所述第一目标内存块作为分配的内存块。
93.可选的,所述处理模块403还用于:
94.若所述第一差值不小于第二阈值,则将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块;所述第二阈值大于所述第一阈值;所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值;
95.将所述第一子目标内存块作为分配的内存块。
96.可选的,所述处理模块403还用于:
97.若所述第一差值大于所述第一阈值且小于第二阈值,则按照所述预设顺序查找所述各结点对应内存块的大小,确定所述堆内存中的第二目标内存块;所述第二目标内存块为:所述堆内存中与待分配内存空间的第二差值不小于所述第二阈值的最小内存块;
98.将所述第二目标内存块作为所述第一目标内存块,返回将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块的步骤。
99.可选的,所述第一子目标内存块的空间等于所述待分配内存空间。
100.可选的,所述预设规则具体为:按照所述各结点对应的内存块大小排列所述各结点的顺序。
101.可选的,当所述各结点的顺序为按照所述各结点对应的内存块大小从大到小排列时,所述预设顺序具体为从所述空闲内存块链表的尾结点依次向首结点查找;
102.当所述各结点的顺序为按照所述各结点对应的内存块大小从小到大排列时,所述预设顺序具体为从所述空闲内存块链表的首结点依次向尾结点查找。
103.可选的,所述获取模块401还用于:获取内存块总链表;所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小;所述处理模块403还用于:针对所述内存块总链表任一结点,在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并该结点的内存块、所述前一结点的内存块和\或所述后一结点的内存块,从而更新所述内存块总链表。
104.基于同一发明构思,本发明实施例还提供了一种计算机设备,包括程序或指令,当所述程序或指令被执行时,如本发明实施例提供的堆内存管理方法及任一可选方法被执行。
105.基于同一发明构思,本发明实施例还提供了一种计算机可读存储介质,包括程序或指令,当所述程序或指令被执行时,如本发明实施例提供的堆内存管理方法及任一可选方法被执行。
106.尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优
选实施例以及落入本发明范围的所有变更和修改。
107.显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1