基于树形结构的堆外内存管理的方法、系统、终端设备及存储介质

阅读: 评论:0

著录项
  • CN202211548906.8
  • 20221205
  • CN115934326A
  • 20230407
  • 中信银行股份有限公司
  • 李明;马融;李春兰
  • G06F9/50
  • G06F9/50 G06F12/06 G06F16/901

  • 北京市朝阳区光华路10号院1号楼6-30层、32-42层
  • 北京(11)
  • 北京市兰台律师事务所
  • 张博;张峰
摘要
本发明提供了一种基于树形结构的堆外内存管理的方法、系统、终端设备及存储介质,涉及计算机系统领域。本发明在socket通讯组件,数据的发送和接收过程中,为每个线程开启一个堆外内存分配器,每个分配器管理一个树形结构的内存池,一方面避免了在多线程情况下资源分配的锁竞争,提高通讯组件的处理能力,另一方面内存池中的内存可以重复利用,当下次要申请内存的时候直接从内存池中查可用内存,是否有缓存内存可用,如果有,则直接分配,提高分配效率。
权利要求

1.一种基于树形结构的堆外内存管理的方法,其特征在于,包括以下步骤:

步骤S21,应用程序申请使用堆外内存;

步骤S22,根据当前线程或者其他能避免资源竞争的对象查相关的内存分配器,如果没有,则创建一个,后续都使用该分配器分配内存;

步骤S23,判断申请的内存是否超过设置的池化管理的最大内存块,如果超过,则直接分配,分配结束,如果没有超过,则执行步骤S24;

步骤S24,将申请的内存数向上归一化处理;

步骤S25,是否首次申请,如果是,则先申请一个大内存块并交给对象Chunk管理,如果不是首次申请,则执行步骤S28;

步骤S26,创建并初始化Chunk,初始化包括一些基本参数和数据结构,并加入到Chunk列表中;

步骤S27,将Chunk管理的内存块按照基本单元PageUnit大小拆分成完全二叉树结构;

步骤S28,在Chunk列表中选择一个合适的Chunk申请实际需要的内存,如果Chunk中剩余内存不够当前申请,则执行步骤S26,如果内存足够则执行步骤S29;

步骤S29,在Chunk中到一个满足申请的内存节点返回,并标记该节点为已分配,并同时递归更新上层节点剩余内存容量;

步骤S30,应用程序内存使用;

步骤S31,使用完毕后,大内存直接释放。

2.根据权利要求1所述的方法,其特征在于,步骤S31中,Chunk管理的内存释放内存至Chunk树中,并标记为未使用,等待下次申请。

3.一种基于树形结构的堆外内存管理的系统,其特征在于,包括:请求端、内存分配器以及逻辑处理模块。

4.根据权利要求3所述的系统,其特征在于,请求端,基于应用程序申请使用堆外内存。

5.根据权利要求3所述的系统,其特征在于,内存分配器,根据请求端的请求并按照设定分配相关内存。

6.根据权利要求3所述的系统,其特征在于,逻辑处理模块,管理基本参数以及数据结构,并根据线程以及运行情况管理内存分配。

7.一种终端设备,其特征在于,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当所述终端设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行时执行如权利要求1至2任一项所述的方法的步骤。

8.一种存储介质,其特征在于,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如权利要求1至2任一项所述的方法的步骤。

说明书
技术领域

本发明涉及计算机系统领域,具体而言,涉及一种基于树形结构的堆外内存管理的方法、系统、终端设备及存储介质。

堆外内存是指内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。

完全二叉树是指一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

目前堆外内存在一些场景下能显著提高性能,堆外内存可以避免虚拟机堆和操作系统内核来回复制数据,不受JVM控制的内存。相比于堆内内存有几个优势:

1,减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作;

2,加快了复制的速度,因为从堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。

但是也存在一些缺陷,包括:

1,堆外内存难以管理,如果使用不当,那么很容易导致内存用尽;

2,堆外内存的申请比较复杂,耗时长,频繁的申请,释放比较浪费资源。

本发明实施例提供一种基于树形结构的堆外内存管理的方法、系统、终端设备及存储介质。

一种基于树形结构的堆外内存管理的方法,具体步骤包括:

步骤S21,应用程序申请使用堆外内存;

步骤S22,根据当前线程或者其他能避免资源竞争的对象查相关的内存分配器,如果没有,则创建一个,后续都使用该分配器分配内存;

步骤S23,判断申请的内存是否超过设置的池化管理的最大内存块,如果超过,则直接分配,分配结束,如果没有超过,则执行步骤S24;

步骤S24,将申请的内存数向上归一化处理;

步骤S25,是否首次申请,如果是,则先申请一个大内存块并交给对象Chunk管理,如果不是首次申请,则执行步骤S28;

步骤S26,创建并初始化Chunk,初始化包括一些基本参数和数据结构,并加入到Chunk列表中;

步骤S27,将Chunk管理的内存块按照基本单元PageUnit大小拆分成完全二叉树结构,比如内存块大小是16M,基本单元是8K,那么就可以拆分成高度是11的完全二叉树,每个叶子节点代表8K的内存,上层节点的内存是下层节点的内存之和,根节点内存就是16M;

步骤S28,在Chunk列表中选择一个合适的Chunk申请实际需要的内存,如果Chunk中剩余内存不够当前申请,则执行步骤S26,如果内存足够则执行步骤S29;

步骤S29,在Chunk中到一个满足申请的内存节点返回,并标记该节点为已分配,并同时递归更新上层节点剩余内存容量;

步骤S30,应用程序内存使用;

步骤S31,使用完毕后,大内存直接释放,Chunk管理的内存释放内存至Chunk树中,并标记为未使用,等待下次申请。

进一步的:一种基于树形结构的堆外内存管理的系统,包括:请求端、内存分配器以及逻辑处理模块;

请求端,基于应用程序申请使用堆外内存;

内存分配器,根据请求端的请求并按照设定分配相关内存;

逻辑处理模块,管理基本参数以及数据结构,并根据线程以及运行情况管理内存分配。

进一步的:终端设备可以包括:处理器、存储介质和总线,存储介质存储有处理器可执行的机器可读指令,当终端设备运行时,处理器与存储介质之间通过总线通信,处理器执行机器可读指令,以执行时执行如前述实施例中所述的深度学习模型训练方法的步骤。

进一步的:一种存储介质,该存储有计算机程序,所述计算机程序被处理器运行时执行上述的方法的步骤。

本发明的有益效果:本发明在socket通讯组件,数据的发送和接收过程中,为每个线程开启一个堆外内存分配器,每个分配器管理一个树形结构的内存池,一方面避免了在多线程情况下资源分配的锁竞争,提高通讯组件的处理能力,另一方面内存池中的内存可以重复利用,当下次要申请内存的时候直接从内存池中查可用内存,是否有缓存内存可用,如果有,则直接分配,提高分配效率。

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1示出了本发明方法的流程示意图;

图2示出了本发明装置的组成示意图;

图3示出了本发明终端设备的组成示意图;

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,应当理解,本发明中附图仅起到说明和描述的目的,并不用于限定本发明的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本发明中使用的流程图示出了根据本发明的一些实施例实现的操作。应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本发明内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。

另外,本发明所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明的是,本发明实施例中将会用到术语“包括”,用于指出其后所声明的特征的存在,但并不排除增加其它的特征。还应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。在本发明的描述中,还需要说明的是,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

图1示出了本发明方法的步骤流程图。

在申请内存时,根据线程数先向系统申请若干块连续内存,称为chunk,设置默认大小chunkSize,比如16Mb,通过Chunk对象包装。为了更细粒度的管理,将chunk进一步拆分为page,根据情况设置每个page的大小,比如8Kb,那么每个chunk包含2048个page,将page按照不同粒度进行多层分组管理。

第1层,分组大小size=1*pageSize,一共有2048个组;

第2层,分组大小size=2*pageSize,一共有1024个组;

第3层,分组大小size=4*pageSize,一共有512个组;

第11层,分组大小size=2048*pageSize,一共有1个组;

当请求分配内存时,将请求分配的内存数向上取值到最接近的分组大小,在该分组大小的相应层级中从左至右寻空闲分组,例如请求分配内存对象为1.5pageSize,向上取值到分组大小2pageSize,在第二层分组中到完全空闲的一组内存进行分配。

当分组大小2pageSize的内存分配出去后,为了方便下次内存分配,分组被标记为全部已使用,向上更粗粒度的内存分组被标记为部分已使用。

为了方便快速查chunk中能容纳请求内存的位置,算法构建一个基于byte数组(memoryMap)存储的完全二叉树,当需要创建一个给定大小的内存块,算法需要在Chunk中大小为chunkSize的内存中,到第一个能够容纳申请分配内存的位置。

当申请分配内存,会首先将请求分配的内存大小归一化(向上取值),取最近的2的幂的值,例如4000byte归一化为4096byte,当申请分配大小为chunkSize/2^k的内存,在平衡树高度为k的层级中,从左到右搜索第一个空闲节点,并将节点标识为已分配状态,释放内存时,根据申请内存返回的id将树形数组下标id更新为未分配。

对于申请分配大小超过chunkSize的大对象,可以采用非池化管理策略,在每次请求分配内存时单独创建特殊的非池化Chunk对象进行管理。

对于小于8K的内存分配,这些小对象直接分配一个page会造成浪费,先Chunk中申请空闲page,同一个page分为相同大小规格的小内存进行存储。

为了解决单个Chunk容量有限的问题,将多个Chunk组成链表一起管理,然后用ChunkList对象持有链表的head指针。

基于树形结构的内存使用交互处理流程如下:

步骤S21,应用程序申请使用堆外内存;

步骤S22,根据当前线程或者其他能避免资源竞争的对象查相关的内存分配器,如果没有,则创建一个,后续都使用该分配器分配内存;

步骤S23,判断申请的内存是否超过设置的池化管理的最大内存块,如果超过,则直接分配,分配结束,如果没有超过,则执行步骤S24;

步骤S24,将申请的内存数向上归一化处理;

步骤S25,是否首次申请,如果是,则先申请一个大内存块并交给对象Chunk管理,如果不是首次申请,则执行步骤S28;

步骤S26,创建并初始化Chunk,初始化包括一些基本参数和数据结构,并加入到Chunk列表中;

步骤S27,将Chunk管理的内存块按照基本单元PageUnit大小拆分成完全二叉树结构,比如内存块大小是16M,基本单元是8K,那么就可以拆分成高度是11的完全二叉树,每个叶子节点代表8K的内存,上层节点的内存是下层节点的内存之和,根节点内存就是16M;

步骤S28,在Chunk列表中选择一个合适的Chunk申请实际需要的内存,如果Chunk中剩余内存不够当前申请,则执行步骤S26,如果内存足够则执行步骤S29;

步骤S29,在Chunk中到一个满足申请的内存节点返回,并标记该节点为已分配,并同时递归更新上层节点剩余内存容量;

步骤S30,应用程序内存使用;

步骤S31,使用完毕后,大内存直接释放,Chunk管理的内存释放内存至Chunk树中,并标记为未使用,等待下次申请。

如图2所示,本发明所述的系统,包括:请求端、内存分配器以及逻辑处理模块;

请求端,基于应用程序申请使用堆外内存;

内存分配器,根据请求端的请求并按照设定分配相关内存;

逻辑处理模块,管理基本参数以及数据结构,并根据线程以及运行情况管理内存分配。

如图3所示,该终端设备6可以包括:处理器601、存储介质602和总线603,存储介质602存储有处理器601可执行的机器可读指令,当终端设备运行时,处理器601与存储介质602之间通过总线603通信,处理器601执行机器可读指令,以执行时执行如前述实施例中所述的深度学习模型训练方法的步骤。具体实现方式和技术效果类似,在此不再赘述。

为了便于说明,在上述终端设备中仅描述了一个处理器。然而,应当注意,一些实施例中,本发明中的终端设备还可以包括多个处理器,因此本发明中描述的一个处理器执行的步骤也可以由多个处理器联合执行或单独执行。

以上仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

本文发布于:2023-04-14 08:14:26,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/86514.html

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

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图