小对象内存管理方法、装置、电子设备和计算机可读介质

著录项
  • CN201911080417.2
  • 20191106
  • CN110780823A
  • 20200211
  • 广东三维家信息科技有限公司
  • 刘志伟
  • G06F3/06
  • G06F3/06 G06F12/08

  • 广东省广州市天河区天河软件园软件路15号(孵化二期F栋)9楼902室(仅限办公用途)
  • 广东(44)
  • 北京超凡宏宇专利代理事务所(特殊普通合伙)
  • 谢玲
摘要
本发明提供了一种小对象内存管理方法、装置、电子设备和计算机可读介质,涉及内存管理的技术领域,所述方法包括:预先配置有多个等级的内存池,不同等级的内存池中的内存块的大小不同;确定申请的内存大小所对应的第一内存池;根据所述第一内存池的第一空闲列表,确定第一内存块地址;返回申请到的所述第一内存块地址;本发明能够有效避免出现内存碎片,极大减少申请内存时查询空闲内存块的时间,提升命中率。
权利要求

1.一种小对象内存管理方法,其特征在于,预先配置有多个等级的内存池,不同等级的内存池中的内存块的大小不同,所述方法包括:

确定申请的内存大小所对应的第一内存池;

根据所述第一内存池的第一空闲列表,确定第一内存块地址;

返回申请到的所述第一内存块地址。

2.根据权利要求1所述的方法,其特征在于,所述第一空闲列表预先配置有最小存储阈值,所述第一空闲列表用于存放最近释放的内存块的索引;根据所述第一内存池的第一空闲列表,确定第一内存块地址的步骤,包括:

判断所述第一空闲列表中索引的个数是否大于所述最小存储阈值;

如果是,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不是,则根据预先确定的最大空闲索引确定所述第一内存块的地址。

3.根据权利要求2所述的方法,其特征在于,根据预先确定的最大空闲索引确定所述第一内存块的地址的步骤,包括:

判断所述最大空闲索引是否存在;

如果存在,则将所述最大空闲索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不存在,且所述第一空闲列表不为空,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不存在,且所述第一空闲列表为空,则根据空闲掩码确定第一内存块的地址。

4.根据权利要求3所述的方法,其特征在于,每当所述最大空闲索引被使用后,将所述最大空闲索引加1作为最新的所述最大空闲索引,当新的所述最大空闲索引等于所述第一内存池的容量时,将所述最大空闲索引至为空。

5.根据权利要求2所述的方法,其特征在于,还包括:

判断需释放的第二内存地址是否在所述多个等级的内存池的地址范围内;

如果是,计算所述第二内存地址相应第二内存块的索引值,清空所述第二内存块;

若所述第二内存地址相应第二内存池的第二空闲列表不满,则将所述第二内存块的索引添加到所述第二空闲列表。

6.根据权利要求5所述的方法,其特征在于,还包括:

确定传入的字节所对应第二内存池。

7.一种小对象内存管理装置,其特征在于,预先配置有多个等级的内存池,不同等级的内存池中的内存块的大小不同,所述装置包括:

第一确定模块,用于确定申请的内存大小所对应的第一内存池;

第二确定模块,用于根据所述第一内存池的第一空闲列表,确定第一内存块地址;

返回模块,用于返回申请到的所述第一内存块地址。

8.根据权利要求7所述的装置,其特征在于,所述第一空闲列表预先配置有最小存储阈值,所述第一空闲列表用于存放最近释放的内存块的索引;第二确定模块包括:

判断模块,用于判断所述第一空闲列表中索引的个数是否大于所述最小存储阈值;

第一计算模块,用于在判断模块的判断结果为是时,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

第二计算模块,用于在判断模块的判断结果为不是时,则根据预先确定的最大空闲索引确定所述第一内存块的地址。

9.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现上述权利要求1至6任一项所述的方法的步骤。

10.一种具有处理器可执行的非易失的程序代码的计算机可读介质,其特征在于,所述程序代码使所述处理器执行所述权利要求1-6任一项所述方法。

说明书
技术领域

本发明涉及内存管理技术领域,尤其是涉及一种小对象内存管理方法、装置、电子设备和计算机可读介质。

内存是软件的基石,内存管理是否得当往往决定一个软件的质量。通常应用程序中需要大量且高频的使用较小字节内存的对象,如符串、数组、结构体以及其他自定义类型等。这些小字节对象通常数量庞大且生命周期短暂,若频繁的申请和释放,势必会导致存在较为严重的内存碎片,进而导致程序的性能急剧恶化。而频繁使用new-delete(C++方式的申请-释放)、malloc-free(C方式的申请-释放)等系统调用方式,由于他们调用底层操作系统,涉及到内核态和用户态之间来回切换,调用速度较慢,容易出现卡顿,甚至比进程内函数调用慢很多。

本发明的目的在于提供一种小对象内存管理方法、装置、电子设备和计算机可读介质,能够有效避免出现内存碎片,极大减少申请内存时查询空闲内存块的时间,提升命中率。

第一方面,实施例提供一种小对象内存管理方法,预先配置有多个等级的内存池,不同等级的内存池中的内存块的大小不同,所述方法包括:

确定申请的内存大小所对应的第一内存池;

根据所述第一内存池的第一空闲列表,确定第一内存块地址;

返回申请到的所述第一内存块地址。

本实施例能够有效避免出现内存碎片,极大减少申请内存时查询空闲内存块的时间,提升命中率。

在可选的实施方式中,所述第一空闲列表预先配置有最小存储阈值,所述第一空闲列表用于存放最近释放的内存块的索引;根据所述第一内存池的第一空闲列表,确定第一内存块地址的步骤,包括:

判断所述第一空闲列表中索引的个数是否大于所述最小存储阈值;

如果是,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不是,则根据预先确定的最大空闲索引确定所述第一内存块的地址。

在可选的实施方式中,根据预先确定的最大空闲索引确定所述第一内存块的地址的步骤,包括:

判断所述最大空闲索引是否存在;

如果存在,则将所述最大空闲索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不存在,且所述第一空闲列表不为空,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不存在,且所述第一空闲列表为空,则根据空闲掩码确定第一内存块的地址。

在可选的实施方式中,每当所述最大空闲索引被使用后,将所述最大空闲索引加1作为最新的所述最大空闲索引,当新的所述最大空闲索引等于所述第一内存池的容量时,将所述最大空闲索引至为空。

在可选的实施方式中,还包括:

判断需释放的第二内存地址是否在所述多个等级的内存池的地址范围内;

如果是,计算所述第二内存地址相应第二内存块的索引值,清空所述第二内存块;

若所述第二内存地址相应第二内存池的第二空闲列表不满,则将所述第二内存块的索引添加到所述第二空闲列表。

在可选的实施方式中,还包括:

确定传入的字节所对应第二内存池。

第二方面,实施例提供一种小对象内存管理装置,预先配置有多个等级的内存池,不同等级的内存池中的内存块的大小不同,所述装置包括:

第一确定模块,用于确定申请的内存大小所对应的第一内存池;

第二确定模块,用于根据所述第一内存池的第一空闲列表,确定第一内存块地址;

返回模块,用于返回申请到的所述第一内存块地址。

在可选的实施方式中,所述第一空闲列表预先配置有最小存储阈值,所述第一空闲列表用于存放最近释放的内存块的索引;第二确定模块包括:

判断模块,用于判断所述第一空闲列表中索引的个数是否大于所述最小存储阈值;

第一计算模块,用于在判断模块的判断结果为是时,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

第二计算模块,用于在判断模块的判断结果为不是时,则根据预先确定的最大空闲索引确定所述第一内存块的地址。

第三方面,实施例提供一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述前述实施方式任一所述的方法的步骤。

第四方面,实施例提供一种具有处理器可执行的非易失的程序代码的计算机可读介质,所述程序代码使所述处理器执行所述前述实施方式任一所述方法。

本发明提供的小对象内存管理方法、装置、电子设备和计算机可读介质,其配置多个等级的内存池,对不同区间大小的内存进行分级管理,并为不同等级的内存池设置不同大小的内存块;通过确定内存池,根据内存池的空闲列表确定内存块地址,从而使得申请内存时最大程度的一次性命中合适的空闲内存块,有效避免了出现内存碎片,极大减少了申请内存时查询空闲内存块的时间,提升了命中率。

为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的小对象内存管理方法的流程图;

图2为本发明实施例提供的小对象内存管理方法原理图;

图3为本发明实施例提供的小对象内存管理方法另一个原理图;

图4为本发明实施例提供的小对象内存管理方法的另一个流程图;

图5为本发明实施例提供的小对象内存管理方法的另一个流程图;

图6为本发明实施例提供的小对象内存管理装置的系统原理图;

图7为本发明实施例提供的电子设备的系统原理图。

图标:61-第一确定模块;62-第二确定模块;63-返回模块;700-电子设备;701-通信接口;702-处理器;703-存储器;704-总线。

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

在本发明的描述中,需要说明的是,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

下面结合附图,对本发明的一些实施方式作详细说明。在不冲突的情况下,下述的实施例及实施例中的特征可以相互组合。

通常应用程序中需要大量且高频的使用较小字节内存的对象,如符串、数组、结构体以及其他自定义类型等。这些小字节对象通常数量庞大且生命周期短暂,若频繁的申请和释放,势必会导致存在较为严重的内存碎片,进而导致系统运行一段时间后性能急剧下降;而这种情况再申请内存时,命中率低或根本申请不到合适大小的内存。另外,频繁使用new-delete(C++方式的申请-释放)或malloc-free(C方式的申请-释放)等系统调用,代价比较昂贵,因为他们会调用底层操作系统,涉及到内核态和用户态之间来回切换,往往比进程内函数调用速度慢很多,而查空闲合适的内存块所导致的时间性能的损耗往往是决定内存池优劣的重要指标。

基于此,本实施例提供一种小对象内存管理方法、装置、电子设备和计算机可读介质,能够有效避免出现内存碎片,极大减少申请内存时查询空闲内存块的时间,提升命中率。

参照图1,一种小对象内存管理方法,预先配置有多个等级的内存池,不同等级的内存池中的内存块的大小不同,所述方法包括:

S110,确定申请的内存大小所对应的第一内存池;

S120,根据所述第一内存池的第一空闲列表,确定第一内存块地址;

S130,返回申请到的所述第一内存块地址。

具体地,内存池是一种内存分配方式,是在真正使用内存之前,先申请分配一定数量的、大小相等的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,如果内存不够再继续申请新的内存。本实施例预先对内存池进行分级,例如,内存池的等级可以按照16字节、32字节、64字节、128字节等进行分级。

以16字节内存池为例子,16字节的内存池假设需要申请1M的内存,则内存块的大小为BLOCK_SIZE=1024*1024/16=64*1024bytes,即16bytes级的内存池拥有BLOCK_SIZE个连续的内存块。

其中,BLOCK_SIZE表示各级内存池大小。为经验值(根据软件复杂度选择适合的大小以满足绝大多数情况,少数额外超过内存池容量的内存可特殊处理,其对整体性能影响可以忽略。

如图2所示,本实施例申请内存的流程为,根据所分等级确定第一内存池,即如果申请12字节的内存,则选择16字节内存池,执行查算法查空闲内存块,然后返回内存地址,如0x0A。

本实施例通过对不同区间大小的内存进行分级管理,通过确定内存池,根据内存池的空闲列表确定内存块地址的方式,使得申请内存时最大程度的一次性命中合适的空闲内存块,有效避免了出现内存碎片,极大减少了申请内存时查询空闲内存块的时间,提升了命中率。

可选地,所述第一空闲列表预先配置有最小存储阈值,所述第一空闲列表用于存放最近释放的内存块的索引;根据所述第一内存池的第一空闲列表,确定第一内存块地址的步骤,包括:

判断所述第一空闲列表中索引的个数是否大于所述最小存储阈值;

如果是,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不是,则根据预先确定的最大空闲索引确定所述第一内存块的地址。

具体地,最小存储阈值指空闲队列最小保留长度,为经验值,例如取值为5。

如图4所示,本实施例的具体步骤为:

S400:判断内存大小是否小于等于16Bytes,如果是则转S401,否则走其他内存池处理流程;

S401:判断idle_list长度是否大于MIN_IDLE_LIST_SIZE,是则转S402,否则转S403;

具体地,选择16字节级内存池,判断idle_list(空闲列表)中可用空闲的idleindex(索引)个数是否大于MIN_IDLE_LIST_SIZE(最小存储阈值);

S402:取出index,计算其地址,并置位idle_mask_bitset;转S410;

具体地,取出idle_list中队尾的index(索引)弹出作为当前空闲内存块的索引,并计算index对应内存块的地址(addr=mem_header_addr+(index-1)×16),同时将idle_mask_bitset对应的位(即第index位)置1。

其中,idle_list用于存放最近释放的MAX_DILE_LIST_SIZE个block的index索引值,容量固定为MAX_DILE_LIST_SIZE,超过则不再添加,当idle_list个数不足最小存储阈值时,优先使用最大空闲索引作为空闲列表的索引值。mem_header_addr指各级内存池的首地址。MAX_DILE_LIST_SIZE指空闲队列容量,为经验值,预设值为20,用于防止空闲列表长度变化导致频繁重新分配。

本实施例中,MAX_DILE_LIST_SIZE和MIN_IDLE_LIST_SIZE均为经验值,该值需要根据不同软件的复杂程度进行统计后再预设一个合理的值,目的是尽量减少去遍历idle_mask_bitset的机会,以及当idle_list为空时遍历idle_mask_bitset的长度不必太长(MAX_DILE_LIST_SIZE不宜取值过大)。

可选地,根据预先确定的最大空闲索引确定所述第一内存块的地址的步骤,包括:

判断所述最大空闲索引是否存在;

如果存在,则将所述最大空闲索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不存在,且所述第一空闲列表不为空,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

如果不存在,且所述第一空闲列表为空,则根据空闲掩码确定第一内存块的地址。

具体地,最大空闲索引表示当前内存池中已被(或曾经被)申请过的index最大的那个block的下一个block的索引(即内存池中尚未被申请过的第一个block的索引值),初始化为0,每次该值对应block被申请过后自动加1,当其值增长到BLOCK_SIZE时,则将该值置为-1,表示该内存池中所有内存块均被申请过,后面不再使用该值。

如图4所示,本实施例的具体步骤为:

S403:判断max_idle_index是否等于-1;如果是则转S405,否则转S404;

具体地,idle_list小于MIN_IDLE_LIST_SIZE,则判断max_idle_index(最大空闲索引)是否等于-1。

S404:根据max_idle_index计算内存地址,置位idle_mask_bitset,转S410;

具体地,将max_idle_index的值作为当前查询到的空闲内存块index,并计算内存地址(addr),同时置位idle_mask_bitset相应bit位,max_idle_index加1(如果max_idle_index等于BLOCK_SIZE,则将max_idle_index置为-1)。

S405:判断idle_list是否为空,如果是则转S407,否则转S406;

max_idle_index等于-1,则判断idle_list是否为空。

S406:取出index,计算内存地址,置位idle_mask_bitset,转S410;

idle_list不为空则弹出尾部的index值并计算内存地址addr,同时置位idle_mask_bitset相应bit位。

S407:遍历idle_mask_bitset,查空闲block,如果查到空闲block,则计算出内存地址,同时重新将bit置为1,则转S408;

max_idle_index为-1,且idle_list为空,则遍历idle_mask_bitset,到第一个状态为0的bit位作为当前空闲内存块的index,计算出内存地址,同时重新将bit置为1。

其中,idle_mask_bitset是以bit为单位的容器。每一位对应内存池中相应内存池当前状态,如表示0空闲,1表示忙,如图3所示。长度同内存块数量BLOCK_SIZE;idle_mask_bitset全部初始化为0。

可选地,每当所述最大空闲索引被使用后,将所述最大空闲索引加1作为最新的所述最大空闲索引,当新的所述最大空闲索引等于所述第一内存池的容量时,将所述最大空闲索引至为空。

具体地,最大空闲索引的初始值为0,每次被使用后加1,当增长到内存池大小时,将其置为空,表示已经到最后一个block,后续不再使用该值。

可选地,还包括:

判断需释放的第二内存地址是否在所述多个等级的内存池的地址范围内;

如果是,计算所述第二内存地址相应第二内存块的索引值,清空所述第二内存块;

若所述第二内存地址相应第二内存池的第二空闲列表不满,则将所述第二内存块的索引添加到所述第二空闲列表。

具体地,S408:继续遍历idle_mask_bitset剩下的位,出MAX_DILE_LIST_SIZE个空闲的index并依次装入idle_list中,是否到一个空闲的index,是则转S410,否则转S409。

S409:转其他申请流程;

具体地,如果内存池中当前无空闲的block,则走其他申请流程。

S410:返回申请到的内存地址addr,申请流程完成。

本实施例的基于经验值的内存查方法,能够一次命中合适的空闲内存块,提升了内存申请效率,有效避免出现卡顿,方法简单,易于实现。

可选地,还包括:

确定传入的字节所对应第二内存池。

具体地,本实施例的内存释放的原理如图2所示,首先穿入内存地址及字节数,例如0xA,12字节;选择相应级别的内存池,即16字节内存池,清除对应地址内存块。具体步骤如图5所示。

S501:判断传入的字节大小选择对应级数的内存池(根据需要也可只需传入内存地址,根据地址判断属于哪一级内存池的空间),转S502;

S502:判断需释放的内存地址是否在当前内存池地址范围内(即mem_header_addr~mem_header_addr+(BLOCK_SIZE-1)×16),是则转S503,否则转S504;

S503:计算该内存地址相应内存块的index索引值,清空该内存块,idle_mask_bitset对应bit位置0(空闲),且若idle_list不满,则将index添加到队列中,转S505;

S504:地址不在内存池中,则为其他流程申请的,则走其他释放流程(如直接delete);

S505:完成。

本实施例的内存释放流程,结合智能指针技术,能够对所需释放的内存进行自动回收,方法简单,易于实现。

本实施例避免了内存碎片问题,极大减少了申请内存时查询空闲内存块的时间-提升了命中率,对不同区间内存的申请和释放都进行了有效管理,便于统计、调试等,还结合智能指针等内存管理技术,可以有效解决基于GC的内存池卡顿问题。

如图6所示,一种小对象内存管理装置,预先配置有多个等级的内存池,不同等级的内存池中的内存块的大小不同,所述装置包括:

第一确定模块61,用于确定申请的内存大小所对应的第一内存池;

第二确定模块62,用于根据所述第一内存池的第一空闲列表,确定第一内存块地址;

返回模块63,用于返回申请到的所述第一内存块地址。

可选地,所述第一空闲列表预先配置有最小存储阈值,所述第一空闲列表用于存放最近释放的内存块的索引;第二确定模块62包括:

判断模块,用于判断所述第一空闲列表中索引的个数是否大于所述最小存储阈值;

第一计算模块,用于在判断模块的判断结果为是时,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

第二计算模块,用于在判断模块的判断结果为不是时,则根据预先确定的最大空闲索引确定所述第一内存块的地址。

可选地,第二计算模块包括:

最大空闲索引判断模块,用于判断所述最大空闲索引是否存在;

最大空闲索模块,用于如果存在,则将所述最大空闲索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

队尾索引模块,用于如果不存在,且所述第一空闲列表不为空,则将所述第一空闲列表中队尾的索引作为所述第一内存块的索引;根据所述第一内存块的索引计算所述第一内存块的地址;

空闲掩码模块,用于如果不存在,且所述第一空闲列表为空,则根据空闲掩码确定第一内存块的地址。

可选地,还包括附加模块,用于每当所述最大空闲索引被使用后,将所述最大空闲索引加1作为最新的所述最大空闲索引,当新的所述最大空闲索引等于所述第一内存池的容量时,将所述最大空闲索引至为空。

可选地,还包括:

第二内存地址模块,用于判断需释放的第二内存地址是否在所述多个等级的内存池的地址范围内;

索引值模块,用于如果是,计算所述第二内存地址相应第二内存块的索引值,清空所述第二内存块;

添加模块,用于所述第二内存地址相应第二内存池的第二空闲列表不满,则将所述第二内存块的索引添加到所述第二空闲列表。

可选地,还包括:

确定模块,用于确定传入的字节所对应第二内存池。

参见图7,本发明实施例还提供一种设备,本发明实施例还提供了一种电子设备700,包括通信接口701、处理器702、存储器703以及总线704,处理器702、通信接口701和存储器703通过总线704连接;上述存储器703用于存储支持处理器702执行上述小对象内存管理方法的计算机程序,上述处理器702被配置为用于执行该存储器703中存储的程序。

可选地,本发明实施例还提供一种具有处理器可执行的非易失的程序代码的计算机可读介质,程序代码使处理器执行如上述实施例中的小对象内存管理方法。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

本文发布于:2024-09-25 20:22:55,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/86868.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议