本发明专利技术公开了一种堆内存管理方法及装置,其中方法为:获取空闲内存块链表;所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的;按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块;所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块;若所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,则将所述第一目标内存块作为分配的内存块。分配的内存块。分配的内存块。
【技术实现步骤摘要】
一种堆内存管理方法及装置
[0001]本专利技术涉及堆内存管理
,尤其涉及一种堆内存管理方法及装置。
技术介绍
[0002]堆内存允许程序在运行时动态地申请某个大小的内存空间,为程序的设计、运行提供了便利,许多计算机处理系统会涉及到堆内存。堆内存中需要频繁地进行内存块的分配和释放,那么堆内存的管理便是随之而来的问题。由于程序运行时每次都必须用地址连续的内存,所以堆内存每次也会分配一个地址连续的内存块。
[0003]对于较大的一段内存,直接将其分配出去会造成大量的内存浪费。为了保证堆内存充分利用,切分多个小段内存,便可以多次分配。但随着堆内存使用的次数增多,整个堆内存可能会出现多块连续但较小的内存,这些内存空间由于较小,成为碎片化的内存,很难作为内存块分配运行程序,这些碎片化的又积少成多,使得堆内存一部分空间被浪费,这就是堆内存的碎片化问题。目前堆内存的碎片化较为普遍,亟待解决。
技术实现思路
[0004]本专利技术提供一种堆内存管理方法及装置,解决了现有技术中堆内存的碎片化的问题。
[0005]第一方面,本专利技术提供一种堆内存管理方法,包括:获取空闲内存块链表;所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的;
[0006]按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块;所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块;
[0007]若所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,则将所述第一目标内存块作为分配的内存块。
[0008]上述方法下,所述空闲内存块链表任一结点存储了该结点对应内存块的大小,且按预设规则排列,那么通过预设顺序可以查找到所述各结点对应内存块的大小,确定堆内存中的第一目标内存块,从而所述第一目标内存块是内存空间最接近所述待分配内存空间的内存块,且第一目标内存块的空间足够分配,如果所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,说明所述第一目标内存块额外的分配空间小于设定的第一阈值内,且不至于切分后额外的内存成为碎片化的内存,从而缓解了堆内存的碎片化现象。
[0009]可选的,若所述第一差值不小于第二阈值,则将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块;所述第二阈值大于所述第一阈值;所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值;
[0010]将所述第一子目标内存块作为分配的内存块。
[0011]上述方法中,由于所述第二阈值大于所述第一阈值,若所述第一差值不小于第二阈值,说明堆内存除第一目标内存块之外的内存大于设定的所述第二阈值,仍然可以作为后续使用,不至于切分后成为碎片化的内存。
[0012]可选的,若所述第一差值大于所述第一阈值且小于第二阈值,则按照所述预设顺序查找所述各结点对应内存块的大小,确定所述堆内存中的第二目标内存块;所述第二目标内存块为:所述堆内存中与待分配内存空间的第二差值不小于所述第二阈值的最小内存块;
[0013]将所述第二目标内存块作为所述第一目标内存块,返回将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块的步骤。
[0014]上述方法中,若所述第一差值大于所述第一阈值且小于第二阈值,说明切分后的空间虽然不至于碎片化,但又难以作为后续使用,所以可以按照所述预设顺序查找所述各结点对应内存块的大小,直至查找到第二目标内存块,作为第一目标内存块,从而可以使得所述第一目标内存块切分后也不至于碎片化。
[0015]可选的,所述第一子目标内存块的空间等于所述待分配内存空间。
[0016]上述方式下,可以最大化利用堆内存空间,使得剩余的第二子目标内存块最大。
[0017]可选的,所述预设规则具体为:按照所述各结点对应的内存块大小排列所述各结点的顺序。
[0018]可选的,当所述各结点的顺序为按照所述各结点对应的内存块大小从大到小排列时,所述预设顺序具体为从所述空闲内存块链表的尾结点依次向首结点查找;
[0019]当所述各结点的顺序为按照所述各结点对应的内存块大小从小到大排列时,所述预设顺序具体为从所述空闲内存块链表的首结点依次向尾结点查找。
[0020]上述方式下,无论所述各结点的顺序按对应的内存块大小从大到小或者从小到大排列时,都从所述空闲内存块链表所对应内存块大小从小到大查找,尽块查找到第一差值不大于第一阈值的第一目标内存块,作为分配的内存块。
[0021]可选的,获取内存块总链表;所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小;
[0022]针对所述内存块总链表任一结点,在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并该结点的内存块、所述前一结点的内存块和\或所述后一结点的内存块,从而更新所述内存块总链表。
[0023]上述方式下,所述内存块总链表按照各内存块的地址顺序依次存储了所述各内存块的大小,那么在该结点所对应的内存块释放时,若该结点的前一结点的内存块和\或该结点的后一结点的内存块未使用,则合并内存块,从而使得合并后结点的内存块更大。
[0024]第二方面,本专利技术提供一种堆内存管理装置,包括:获取模块,用于获取空闲内存块链表;所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的;
[0025]查找模块,用于按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块;所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块;
[0026]处理模块,用于若所述第一目标内存块的空间与所述待分配内存空间的第一差值
不大于第一阈值,则将所述第一目标内存块作为分配的内存块。
[0027]可选的,所述处理模块还用于:
[0028]若所述第一差值不小于第二阈值,则将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块;所述第二阈值大于所述第一阈值;所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值;
[0029]将所述第一子目标内存块作为分配的内存块。
[0030]可选的,所述处理模块还用于:
[0031]若所述第一差值大于所述第一阈值且小于第二阈值,则按照所述预设顺序查找所述各结点对应内存块的大小,确定所述堆内存中的第二目标内存块;所述第二目标内存块为:所述堆内存中与待分配内存空间的第二差值不小于所述第二阈值的最小内存块;
[0032]将所述第二目标内存块作为所述第一目标内存块,返回将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块的步骤。
[0033]可选的,所述第一子目标内存块的空间等于所述待分配内存空间。
[本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种堆内存管理方法,其特征在于,包括:获取空闲内存块链表;所述空闲内存块链表任一结点存储了该结点对应内存块的大小;所述空闲内存块链表中各结点是按照预设规则排列的;按照预设顺序查找所述各结点对应内存块的大小,确定堆内存中的第一目标内存块;所述预设顺序是根据所述预设规则确定的;所述第一目标内存块为:所述堆内存中不小于待分配内存空间的最小内存块;若所述第一目标内存块的空间与所述待分配内存空间的第一差值不大于第一阈值,则将所述第一目标内存块作为分配的内存块。2.如权利要求1所述的方法,其特征在于,还包括:若所述第一差值不小于第二阈值,则将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块;所述第二阈值大于所述第一阈值;所述第一子目标内存块的空间与所述待分配内存空间的差值不大于所述第一阈值;将所述第一子目标内存块作为分配的内存块。3.如权利要求2所述的方法,其特征在于,还包括:若所述第一差值大于所述第一阈值且小于第二阈值,则按照所述预设顺序查找所述各结点对应内存块的大小,确定所述堆内存中的第二目标内存块;所述第二目标内存块为:所述堆内存中与待分配内存空间的第二差值不小于所述第二阈值的最小内存块;将所述第二目标内存块作为所述第一目标内存块,返回将所述第一目标内存块切分为第一子目标内存块和第二子目标内存块的步骤。4.如权利要求2所述的方法,其特征在于,所述第一子目标内存块的空间等于所述待分配内存空间。5.如权利要求1所述的方法,其特征在于,所述预设规则具体为:按照所述各结点对应的内存块大小排列所述各结点的顺序。6.如权利要求5所述的方法,其特征在于,当所述各结点的...
【专利技术属性】
技术研发人员:郭建慧,李灿灿,
申请(专利权)人:上海创功通讯技术有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。