CN113849309B - 一种业务对象的内存分配方法以及装置 - Google Patents
一种业务对象的内存分配方法以及装置 Download PDFInfo
- Publication number
- CN113849309B CN113849309B CN202111129306.3A CN202111129306A CN113849309B CN 113849309 B CN113849309 B CN 113849309B CN 202111129306 A CN202111129306 A CN 202111129306A CN 113849309 B CN113849309 B CN 113849309B
- Authority
- CN
- China
- Prior art keywords
- memory
- memory block
- block
- pool
- new
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5011—Pool
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种业务对象的内存分配方法、装置、计算机设备以及存储介质,该方法包括:通过线程本地内存池或者全局内存池创建业务对象内存池;在所述业务对象内存池中为业务对象分配第一内存块;在所述第一内存块中构造所述业务对象,其中,所述业务对象关联有辅助类对象;在所述业务对象接收到所述辅助类对象的内存分配请求的情况下,通过遍历所述第一内存块的前驱内存块确定目标内存块;在所述目标内存块中构造所述辅助类对象。解决了现有的内存池管理机制针对多维数据库的业务对象进行内存管理的时候往往系统调用次数过多,导致性能开销大的技术问题。
Description
技术领域
本发明涉及内存管理技术领域,尤其是涉及业务对象的内存分配方法以及装置。
背景技术
现有的内存池机制通常采用二层分配机制,即线程本地内存池和全局回收内存池,应用的内存分配请求首先从线程本地内存池分配,线程本地内存池不足时即从全局内存池分配;释放时先释放到线程本地内存池,当线程本地内存池大小超过一定阈值时则释放到全局内存池,分配内存时按基于对象大小的最佳适应算法(Best-Fit)进行分配。
需要说明的是,当需要处理多维数据库的业务对象的时候,现有的多维数据库的业务对象往往包括了维度、多维数据集、视图等逻辑业务对象,每个多维数据库业务对象由多个C/C++结构体或类对象组成,通过现有的内存池管理机制针对多维数据库的业务对象进行内存管理的时候往往系统调用次数过多,导致性能开销大。
发明内容
本发明提供了一种业务对象的内存分配方法、装置、计算机设备以及存储介质,以解决现有的内存池管理机制针对多维数据库的业务对象进行内存管理的时候往往系统调用次数过多,导致性能开销大的技术问题。
根据本发明的第一方面,提供了一种业务对象的内存分配方法,该方法包括:通过线程本地内存池或者全局内存池创建业务对象内存池;在业务对象内存池中为业务对象分配第一内存块;在第一内存块中构造业务对象,其中,业务对象关联有辅助类对象;在业务对象接收到辅助类对象的内存分配请求的情况下,通过遍历第一内存块的前驱内存块确定目标内存块;在目标内存块中构造辅助类对象。
进一步地,前驱内存块至少包括第二内存块,其中,通过遍历第一内存块的前驱内存块确定目标内存块的步骤包括:将第二内存块的剩余可用内存与内存分配请求进行匹配;在匹配成功的情况下,将第二内存块确定为目标内存块。
进一步地,在匹配失败的情况下,方法还包括:统计第二内存块匹配的失败次数;在失败次数超过预设次数的情况下,获取到第二内存块的前驱内存块第三内存块;通过第三内存块确定目标内存块。
进一步地,第一内存块包括最新内存块指针,其中,在获取不到第二内存块的前驱内存块的情况下,方法还包括:判断最新内存块指针指向的内存块的容量是否小于预设字节;在小于预设字节的情况下,从线程本地内存池或者全局内存池中为业务对象内存池确定分配新的内存块,并且将新的内存块的容量调整为最新内存块指针指向的内存块的容量的预设倍数,控制将第一内存块的最新内存块指针指向新的内存块,根据新的内存块确定目标内存块;在不小于预设字节的情况下,从线程本地内存池或者全局内存池中为业务对象内存池确定分配新的内存块,控制将最新内存块指针指向的内存块的容量确定为新的内存块的容量,并且将第一内存块的最新内存块指向新的内存块,根据最新的内存块确定目标内存块。
进一步地,在目标内存块中构造辅助类对象之后,方法还包括:检测到业务对象的生命周期结束;遍历释放业务对象内存池中的所有内存块。
进一步地,遍历释放业务对象内存池中的所有内存块的步骤包括:将业务对象内存池中的内存块释放至线程本地内存池;在线程本地内存池的容量超过预设容量的情况下,将对象内存池中的内存块释放至全局内存池。
根据本发明的第二方面,提供了一种业务对象的内存分配装置,装置包括:创建单元,用于通过线程本地内存池或者全局内存池创建业务对象内存池;分配单元,用于在业务对象内存池中为业务对象分配第一内存块;第一构造单元,用于在第一内存块中构造业务对象,其中,业务对象关联有辅助类对象;确定单元,用于在业务对象接收到辅助类对象的内存分配请求的情况下,通过遍历第一内存块的前驱内存块确定目标内存块;第二构造单元,用于在目标内存块中构造辅助类对象。
进一步地,所述前驱内存块至少包括第二内存块,其中,确定单元包括:匹配模块,用于将第二内存块的剩余可用内存与内存分配请求进行匹配;确定模块,用于在匹配成功的情况下,将第二内存块确定为目标内存块。
根据本发明的第三方面,提供了一种计算机设备,包括存储器和处理器,存储器上存储有计算机指令,计算机指令在由处理器执行时导致上述任一项的方法被执行。
根据本发明的第四方面,提供了一种非暂时性计算机可读存储介质,其上存储有计算机程序,计算机程序在由处理器执行时导致上述任一项的方法被执行。
本发明提供了一种业务对象的内存分配方法、装置、计算机设备以及存储介质,该方法包括:通过线程本地内存池或者全局内存池创建业务对象内存池;在业务对象内存池中为业务对象分配第一内存块;在第一内存块中构造业务对象,其中,业务对象关联有辅助类对象;在业务对象接收到所述辅助类对象的内存分配请求的情况下,通过遍历第一内存块的前驱内存块确定目标内存块;在目标内存块中构造辅助类对象。解决了现有的内存池管理机制针对多维数据库的业务对象进行内存管理的时候往往系统调用次数过多,导致性能开销大的技术问题。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例一的业务对象的内存分配方法的流程图;
图2为本发明实施例一的业务对象的内存分配方法的示意图;
图3为本发明实施例一的业务对象的内存分配以及释放的方法的流程图;
图4为本发明实施例一的业务对象的内存分配方法的具体流程图;
图5为本发明实施例一的内存释放方法的具体流程图;
图6是本发明实施例二的业务对象的内存分配装置的示意图。
具体实施方式
为了使本发明的上述以及其他特征和优点更加清楚,下面结合附图进一步描述本发明。应当理解,本文给出的具体实施例是出于向本领域技术人员解释的目的,仅是示例性的,而非限制性的。
在以下描述中,阐述了许多具体细节以提供对本发明的透彻理解。然而,对于本领域普通技术人员来说,明显的是,不需要采用具体细节来实践本发明。在其他情况下,未详细描述众所周知的步骤或操作,以避免模糊本发明。
实施例一
如图1所示,本申请提供了一种业务对象的内存分配方法,该方法包括:
步骤S11,通过线程本地内存池或者全局内存池创建业务对象内存池。
具体的,本申请的执行主体可以为处理器或其它带有处理器的计算机设备,在上述步骤S11中,本方案可以从现有二级内存池机制中的本地内存池或者全局内存池中创建业务对象内存池,上述业务对象内存池可以为多维数据库的逻辑业务对象的内存池,即本申请提供了一种新的内存管理机制,即底层是全局回收内存池,上层是线程本地内存池,最上层是逻辑业务对象内存池。各级内存池中内存分配的单元是内存块。
步骤S13,在业务对象内存池中为业务对象分配第一内存块。
具体的,在本方案中,逻辑业务对象的内存池(即上述业务对象内存池)由业务类对象及其辅助的结构体/类对象组成。一个逻辑业务对象对应一个业务对象内存池,一个业务对象内存池称作一个内存池实例。业务对象内存池实例中的内存块随业务对象的内存使用请求逐渐增多。结合图2,上述第一内存块可以为一个逻辑业务对象从线程本地内存池或全局内存池分配第一个内存块1,也可以称为初始内存块1。需要说明的是,在本方案中,第一内存块可以称为初始内存块,也可以称为第一个内存块。
这里需要说明的是,逻辑业务对象是指多维数据库的一个维度、一个多维数据集,或者一个视图等,而不是C++中的类对象的概念,内存块是指一系列预置的内存块尺寸,最小的内存块尺寸是256字节,其余内存块尺寸按1.5倍递增的顺序增长,最大的内存块尺寸是16M字节。一个业务对象内存池实例分配到的第一个内存块大小是256字节。256大小的内存块足够存储大部分的对象。结合图2,初始内存块中有两个指针,最新块指针始终指向最新分配的内存块,当前块指针指向响应新的内存请求的内存块。
步骤S15,在第一内存块中构造业务对象,其中,业务对象关联有辅助类对象。
具体的,在本方案中,在为业务对象分配好第一内存块之后,可以在上述第一内存块中构造业务对象,结合图2,该业务对象可以为业务类A的对象a,需要说明的是,上述业务对象是指多维数据库的维度、多维数据集、视图等类,业务对象可以关联有辅助类对象(比如辅助类B对象b以及辅助类C对象c),结合图2,该业务类A的成员包括指向业务类A所关联的辅助类B的对象的指针,和辅助类C的对象的指针,上述辅助类是指为业务类提供辅助功能的类,例如缓存、日志等功能的类。
步骤S17,在业务对象接收到辅助类对象的内存分配请求的情况下,通过遍历第一内存块的前驱内存块确定目标内存块。
具体的,在本方案中,如果业务对象接收到其辅助类对象的内存分配请求的情况下,此时上述第一内存块中的内存耗尽,本方案则通过遍历第一内存块的前驱内存块确定目标内存块,上述目标内存块可以为满足上述内存分配请求的内存块。结合图2,内存块2的前驱内存块为内存块3。在一种可选的实施例中,结合图2,本方案在分配到内存块2的情况下,可以将分配到的内存块2链接到内存块1的最新块指针上,然后将当前块的指针指向内存块2,后续内存分配请求可以首选从当前块指针指向的内存块进行分配,可以起到减少块末碎块的作用。
步骤S19,在目标内存块中构造辅助类对象。
通过上述步骤,本方案提供了一种高效的逻辑业务对象内存管理方法,在现有二级内存池机制基础上,增加了更上层的业务对象级别内存池,在业务对象内存池中专门针对多维数据库业务对象分配内存,本方案提供的内存管理方法适应了多维数据库业务对象的特性,因此解决了现有的内存池管理机制针对多维数据库的业务对象进行内存管理的时候往往系统调用次数过多,导致性能开销大的技术问题。
可选的,上述前驱内存块至少包括第二内存块,其中,步骤S17,通过遍历第一内存块的前驱内存块确定目标内存块的步骤包括:
步骤S171,将第二内存块的剩余可用内存与内存分配请求进行匹配。
步骤S172,在匹配成功的情况下,将第二内存块确定为目标内存块。
具体的,在本方案中,如果第二内存块的剩余可用内存与辅助类对象的内存分配请求相适应,本方案则直接在第二内存块中构造辅助类对象,结合图2,本方案在内存块2中构造辅助类B的对象b,需要说明的是,该对象同上述业务类A的对象a是UML(统一建模语言)中的组合关系,即对象b是对象a的一部分,二者生命周期相同。
可选的,结合图2,如果业务对象接收到辅助类C的对象的内存分配请求,此时,内存块2中的可用内存如果满足内存分配请求的情况下,本方案可以直接在内存块2中来构造辅助类C的对象c,上述内存块2可以包含多个辅助类对象。
可选的,结合图2,在本方案中,业务对象可以继续接收更多的辅助类对象的内存分配请求,本方案可以从当前块指针所指向的内存块2中分配对象,当块2中的剩余内存不能满足新的内存分配请求时,本方案则可以请求分配得到新块3来存储更多的辅助类对象,本方案可以将分配到的内存块3链接到内存块1的最新块指针上,插入的位置利用了内存访问的时间和空间局部性原理,防止可能被交换到磁盘Swap(交换)分区中的后继块被从磁盘换入内存带来的性能开销。需要说明的是,在接收到新的内存分配请求时,如果内存块3的剩余内存也不能满足新的内存分配请求的情况下,本方案则请求分配新的内存块4来存储更多的辅助类对象。内存块4的插入机制与内存块3的插入机制相同。
可选的,在步骤S171之后,在匹配失败的情况下,方法还包括:
步骤S1710,统计第二内存块匹配的失败次数。
步骤S1711,在失败次数超过预设次数的情况下,获取到第二内存块的前驱内存块第三内存块。
步骤S1712,通过第三内存块确定目标内存块。
具体的,在本方案中,如果当前块指针指向的内存块分配失败次数超过一定阈值参数(即上述预设次数)后,则将当前块指针移动到当前块的前驱块(即上述步骤S1711中的第三内存块)作为新的当前块,目的是兼顾分配的时间效率,当块末碎块连续分配失败后则认为该内存块的块末碎块不足满足未来的分配请求,将来分配时不再考虑。当前块是指初始块中当前块指针指向的内存块。
可选的,第一内存块包括最新内存块指针,其中,在步骤S1710之后,在获取不到第二内存块的前驱内存块的情况下,本方案的方法还可以还包括:
步骤S17101,判断最新内存块指针指向的内存块的容量是否小于预设字节。
步骤S17102,在小于预设字节的情况下,从线程本地内存池或者全局内存池中为业务对象内存池确定分配新的内存块,并且将新的内存块的容量调整为最新内存块指针指向的内存块的容量的预设倍数,控制将第一内存块的最新内存块指针指向新的内存块,根据新的内存块确定目标内存块。
步骤S17103,在不小于预设字节的情况下,从线程本地内存池或者全局内存池中为业务对象内存池确定分配新的内存块,控制将最新内存块指针指向的内存块的容量确定为新的内存块的容量,并且将第一内存块的最新内存块指向新的内存块,根据最新的内存块确定目标内存块。
具体的,在本方案中,上述预设字节可以为16M字节,即在获取不到前驱内存块的情况下,本方案则判断最新内存块指针指向的内存块的大小是否小于16M字节,如果最新内存块容量小于16M字节时,将实例内存池的最新内存块大小属性调整为现有值的1.5倍(即上述预设倍数),直到得到一个新的尺寸能够满足此次内存请求,然后分配该大小的内存块,并成为新的最新块(即上述步骤S17102中的调整最新内存块指针指向的内存块的容量并通过调整后的内存块中确定目标内存块),上述步骤采用了智能递增算法动态指定内存块大小,即如果最新内存块不能满足一个逻辑业务对象的内存请求,则说明该对象将来有潜在的更多的内存请求,因此需要分配一个更大的内存块满足将来的请求,该算法能够降低内存块的分配次数,并有效地减少外部碎块。
可选的,如图3所示,步骤S19在目标内存块中构造辅助类对象之后,方法还包括:
步骤S21,检测到业务对象的生命周期结束。
步骤S23,遍历释放业务对象内存池中的所有内存块。
具体的,在本方案中,当检测到业务对象生命周期结束,本方案则遍历业务对象内存池中的所有内存块(内存块链表),逐个释放内存块,内存释放的单元是内存池实例,当内存池实例对应的业务对象生命周期结束时,一次性释放内存池实例中的所有内存块。
需要说明的是,在现有技术中,现有的内存池机制不能适应多维数据库逻辑业务对象的这种生命周期特点,导致归属于不同业务对象的结构体/C++类对象在同一个内存块中互相交叉,造成某个业务对象生命周期结束后因为同块内存中尚有仍在使用的其他业务对象使用的结构体/C++类对象,而不能即时释放相关内存,造成了内存资源的浪费。通过本方案,由于每个内存池都对应一个业务对象,而多维数据库的特性在于,同一个业务对象中的所有结构体/C++类对象的生命周期都相同,因此,本方案可以一次性释放一个业务对象内存池中的所有内存块,实现了内存资源的及时回收,不会造成资源的浪费。
可选的,步骤S23遍历释放业务对象内存池中的所有内存块的步骤包括:
步骤S231,将业务对象内存池中的内存块释放至线程本地内存池。
步骤S232,在线程本地内存池的容量超过预设容量的情况下,将对象内存池中的内存块释放至全局内存池。
具体的,在本方案中,本方案可以先将内存块释放给线程本地内存池,供本线程将来的内存分配使用,然后判断线程本地内存池大小是否超出阈值,如果线程本地内存池大小超出阈值,本方案则释放给全局回收内存池,供多维库将来的内存分配使用,如果线程本地内存池大小没有超出阈值,继续遍历释放内存池中的下一个内存块。
下面结合图4,介绍本方案的一种可选的实施例:
步骤S201,分配初始256字节内存块,设置最新块大小New_size=256。
具体的,在步骤S201中表示一个业务对象内存池实例的初始内存块分配,该内存块大小是256字节,逻辑业务类对象即在该内存块中构造,将实例内存池的最新内存块大小属性设置为256。
步骤S202,该业务对象收到为辅助类对象分配内存的请求。
步骤S203,从当前块指针指向的内存块,依次遍历前驱块,寻找一个能满足此次内存分配请求的块,先将当前块指针赋值给查找块。
步骤S204,实例内存池判断查找块中剩余可用内存是否满足该分配请求。
步骤S205,如果满足,则直接在查找块可用内存的起始地址构造相应的辅助类对象。
步骤S206,查找块不满足此次内存分配请求,会进一步判断查找块满足内存请求失败的次数是否超过了阈值参数。
步骤S207,查找块分配失败次数超过阈值后,需要更新初始块中的当前块指针指向查找块的前驱块。
步骤S208,当前内存块的分配失败次数自增1。
步骤S209,判断查找块是否有前驱块,例如,块3是块2的前驱块。
步骤S210,在有前驱块的情况下,则将查找块的前驱块设置为新的查找块并继续判断新的查找块是否满足此次内存分配需求。
步骤S211,没有前驱块满足此次内存分配请求时,判断最新内存块指针指向的内存块的大小是否是16M(即图中的0x1000000)字节。
步骤S212,最新内存块大小小于16M字节时,将实例内存池的最新内存块大小属性设置为现有值的1.5倍,至到得到一个新的尺寸能够满足此次内存请求,然后分配该大小的内存块,并成为新的最新块,该步骤采用了智能递增算法动态指定内存块大小,即如果最新内存块不能满足一个逻辑业务对象的内存请求,则说明该对象将来有潜在的更多的内存请求,因此需要分配一个更大的内存块满足将来的请求,该算法能够降低内存块的分配次数,并有效地减少外部碎块。
步骤S213,最新内存块大小是16M字节并耗尽后,新的对象内存分配请求都会分配16M字节大小的内存块,并将第一内存块中的最新内存块指针指向新分配的内存块,本方案将最大内存块的大小限制到16M是为了减少内存浪费。
步骤S214,在最新块中构造此次内存请求的辅助类对象,然后本方案等待下一次辅助类对象分配请求。
下面结合图5,介绍本方案中在业务对象生命周期结束后,关于内存池的释放的实施例:
步骤S501,逻辑业务对象生命周期结束,本方案开始释放该对象内存池。
步骤S502,遍历内存池实例中的内存块链表,逐个释放内存块。
步骤S503,将内存块释放给线程本地内存池,供本线程将来的内存分配使用。
步骤S504,判断线程本地内存池大小是否超出阈值,在否的情况下执行步骤S502,即线程本地内存池大小没有超出阈值,继续遍历释放内存池中的下一个内存块,在是的情况下执行步骤S505。
步骤S505,线程本地内存池大小超出阈值,释放给全局回收内存池,供多维库将来的内存分配使用,然后执行步骤S502,即继续遍历释放内存池中的下一个内存块。
综上,本发明提供了一种高效的逻辑业务对象内存管理的方案,用于多维数据库中的业务逻辑对象的内存池及其管理,在方案中使用了按块分配的预分配机制,本方案在现有二级内存池机制基础上,增加了更上层的业务对象级别内存池;采用了智能递增算法动态调整分配的内存块大小,能够有效地减少外部碎块,降低内存块的分配次数,提高内存分配的效率。本方案采用了降低块末碎块的机制,该机制通过动态调整当前内存块,减少了试错次数,兼顾了分配的时间效率,通过设定阈值参数,在不大幅影响内存分配时间效率的情况下,提高了内存的空间效率。释放机制方面,业务对象生命周期结束后,内存块释放给线程本地内存池或全局回收内存池,做到了内存资源的即时回收,回收的内存可以立即响应新的内存请求。
实施例二
本申请还提供了一种业务对象的内存分配装置,该装置可以设置在服务器等计算机设备中,也可以用于执行上述实施例一中的方法,如图6所示,该装置包括:创建单元40,用于通过线程本地内存池或者全局内存池创建业务对象内存池;分配单元42,用于在业务对象内存池中为业务对象分配第一内存块;第一构造单元44,用于在第一内存块中构造业务对象,其中,业务对象关联有辅助类对象;确定单元46,用于在业务对象接收到辅助类对象的内存分配请求的情况下,通过遍历第一内存块的前驱内存块确定目标内存块;第二构造单元48,用于在目标内存块中构造辅助类对象。
通过上述多个单元,本方案提供了一种高效的逻辑业务对象内存管理方法,在现有二级内存池机制基础上,增加了更上层的业务对象级别内存池,在业务对象内存池中专门针对多维数据库业务对象分配内存,本方案提供的内存管理方法适应了多维数据库业务对象的特性,因此解决了现有的内存池管理机制来对多维数据库的业务对象进行内存管理的时候往往系统调用次数过多,导致性能开销大的技术问题。
可选的,前驱内存块至少包括第二内存块,其中,确定单元包括:匹配模块,用于将第二内存块的剩余可用内存与内存分配请求进行匹配;确定模块,用于在匹配成功的情况下,将第二内存块确定为目标内存块。
本申请还提供了一种计算机设备,包括存储器和处理器,存储器上存储有计算机指令,计算机指令在由处理器执行时导致实施例一中的方法被执行。
本申请还提供了一种非暂时性计算机可读存储介质,其上存储有计算机程序,计算机程序在由处理器执行时导致实施例一中方法被执行。
应理解,本文中前述关于本发明的方法所描述的具体特征、操作和细节也可类似地应用于本发明的装置和系统,或者,反之亦然。另外,上文描述的本发明的方法的每个步骤可由本发明的装置或系统的相应部件或单元执行。
应理解,本发明的装置的各个模块/单元可全部或部分地通过软件、硬件、固件或其组合来实现。各模块/单元各自可以硬件或固件形式内嵌于计算机设备的处理器中或独立于处理器,也可以软件形式存储于计算机设备的存储器中以供处理器调用来执行各模块/单元的操作。各模块/单元各自可以实现为独立的部件或模块,或者两个或更多个模块/单元可实现为单个部件或模块。
在一个实施例中,提供了一种计算机设备,其包括存储器和处理器,存储器上存储有可由处理器执行的计算机指令,计算机指令在由处理器执行时指示处理器执行本发明的实施例一中的方法的各步骤。该计算机设备可以广义地为服务器、终端,或任何其他具有必要的计算和/或处理能力的电子设备。在一个实施例中,该计算机设备可包括通过系统总线连接的处理器、存储器、网络接口、通信接口等。该计算机设备的处理器可用于提供必要的计算、处理和/或控制能力。该计算机设备的存储器可包括非易失性存储介质和内存储器。该非易失性存储介质中或上可存储有操作系统、计算机程序等。该内存储器可为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口和通信接口可用于与外部的设备通过网络连接和通信。该计算机程序被处理器执行时执行本发明的方法的步骤。
本发明可以实现为一种计算机可读存储介质,其上存储有计算机程序,计算机程序在由处理器执行时导致本发明实施例一的方法的步骤被执行。在一个实施例中,计算机程序被分布在网络耦合的多个计算机设备或处理器上,以使得计算机程序由一个或多个计算机设备或处理器以分布式方式存储、访问和执行。单个方法步骤/操作,或者两个或更多个方法步骤/操作,可以由单个计算机设备或处理器或由两个或更多个计算机设备或处理器执行。一个或多个方法步骤/操作可以由一个或多个计算机设备或处理器执行,并且一个或多个其他方法步骤/操作可以由一个或多个其他计算机设备或处理器执行。一个或多个计算机设备或处理器可以执行单个方法步骤/操作,或执行两个或更多个方法步骤/操作。
本领域普通技术人员可以理解,本发明的方法步骤可以通过计算机程序来指示相关的硬件如计算机设备或处理器完成,的计算机程序可存储于非暂时性计算机可读存储介质中,该计算机程序被执行时导致本发明的步骤被执行。根据情况,本文中对存储器、存储、数据库或其它介质的任何引用可包括非易失性和/或易失性存储器。非易失性存储器的示例包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)、闪存、磁带、软盘、磁光数据存储装置、光学数据存储装置、硬盘、固态盘等。易失性存储器的示例包括随机存取存储器(RAM)、外部高速缓冲存储器等。
以上描述的各技术特征可以任意地组合。尽管未对这些技术特征的所有可能组合进行描述,但这些技术特征的任何组合都应当被认为由本说明书涵盖,只要这样的组合不存在矛盾。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (6)
1.一种业务对象的内存分配方法,其特征在于,所述方法包括:
通过线程本地内存池或者全局内存池创建业务对象内存池;
在所述业务对象内存池中为业务对象分配第一内存块;
在所述第一内存块中构造所述业务对象,其中,所述业务对象关联有辅助类对象;
在所述业务对象接收到所述辅助类对象的内存分配请求的情况下,通过遍历所述第一内存块的前驱内存块确定目标内存块;
在所述目标内存块中构造所述辅助类对象;
所述前驱内存块至少包括第二内存块,其中,通过遍历所述第一内存块的前驱内存块确定目标内存块的步骤包括:
将所述第二内存块的剩余可用内存与所述内存分配请求进行匹配;
在匹配成功的情况下,将所述第二内存块确定为所述目标内存块;
在第二内存块的剩余内存不能满足新的内存分配请求时,利用内存访问时间和空间局部性原理将新分配的第三内存块插入第一内存块的最新块指针上;
在匹配失败的情况下,统计所述第二内存块匹配的失败次数;
在所述失败次数超过预设次数的情况下,获取到所述第二内存块的前驱内存块第三内存块,并将第三内存块作为新的当前内存块来满足后续的内存分配请求;
通过所述第三内存块确定所述目标内存块;
所述第一内存块包括最新内存块指针,其中,在获取不到所述第二内存块的前驱内存块的情况下,判断所述最新内存块指针指向的内存块的容量是否小于预设字节;
在小于预设字节时,从所述线程本地内存池或者所述全局内存池中为所述业务对象内存池确定分配新的内存块,并且将所述新的内存块的容量调整为所述最新内存块指针指向的内存块的容量的1.5倍,直到得到一个新的尺寸能够满足此次内存请求,控制将所述第一内存块的最新内存块指针指向所述新的内存块,根据所述新的内存块确定所述目标内存块;
在不小于预设字节的情况下,从所述线程本地内存池或者所述全局内存池中为所述业务对象内存池确定分配新的内存块,控制将所述最新内存块指针指向的内存块的容量确定为所述新的内存块的容量,并且将所述第一内存块的最新内存块指向所述新的内存块,根据所述最新内存块确定所述目标内存块。
2.根据权利要求1所述的方法,其特征在于,在所述目标内存块中构造所述辅助类对象之后,所述方法还包括:
检测到所述业务对象的生命周期结束;
遍历释放所述业务对象内存池中的所有内存块。
3.根据权利要求2所述的方法,其特征在于,遍历释放所述业务对象内存池中的所有内存块的步骤包括:
将所述业务对象内存池中的内存块释放至所述线程本地内存池;
在所述线程本地内存池的容量超过预设容量的情况下,将所述对象内存池中的内存块释放至所述全局内存池。
4.一种业务对象的内存分配装置,其特征在于,所述装置包括:
创建单元,用于通过线程本地内存池或者全局内存池创建业务对象内存池;
分配单元,用于在所述业务对象内存池中为业务对象分配第一内存块;
第一构造单元,用于在所述第一内存块中构造所述业务对象,其中,所述业务对象关联有辅助类对象;
第一确定单元,用于在所述业务对象接收到所述辅助类对象的内存分配请求的情况下,通过遍历所述第一内存块的前驱内存块确定目标内存块;
第二构造单元,用于在所述目标内存块中构造所述辅助类对象;
第一确定单元,还用于将第二内存块的剩余可用内存与所述内存分配请求进行匹配;在匹配成功的情况下,将所述第二内存块确定为所述目标内存块;在第二内存块的剩余内存不能满足新的内存分配请求时,利用内存访问时间和空间局部性原理将新分配的第三内存块插入第一内存块的最新块指针上;其中,所述前驱内存块至少包括第二内存块;
统计单元,用于在匹配失败的情况下,统计所述第二内存块匹配的失败次数;
获取单元,用于在所述失败次数超过预设次数的情况下,获取到所述第二内存块的前驱内存块第三内存块,并将第三内存块作为新的当前内存块来满足后续的内存分配请求;
第二确定单元,用于通过所述第三内存块确定所述目标内存块;
判断单元,用于在获取不到所述第二内存块的前驱内存块的情况下,判断最新内存块指针指向的内存块的容量是否小于预设字节;其中,所述第一内存块包括最新内存块指针;
第三确定单元,用于在小于预设字节时,从所述线程本地内存池或者所述全局内存池中为所述业务对象内存池确定分配新的内存块,并且将所述新的内存块的容量调整为所述最新内存块指针指向的内存块的容量的1.5倍,直到得到一个新的尺寸能够满足此次内存请求,控制将所述第一内存块的最新内存块指针指向所述新的内存块,根据所述新的内存块确定所述目标内存块;
第四确定单元,用于在不小于预设字节的情况下,从所述线程本地内存池或者所述全局内存池中为所述业务对象内存池确定分配新的内存块,控制将所述最新内存块指针指向的内存块的容量确定为所述新的内存块的容量,并且将所述第一内存块的最新内存块指向所述新的内存块,根据所述最新内存块确定所述目标内存块。
5.一种计算机设备,包括存储器和处理器,所述存储器上存储有计算机指令,所述计算机指令在由所述处理器执行时导致权利要求1-3中任一项所述的方法被执行。
6.一种非暂时性计算机可读存储介质,其上存储有计算机程序,所述计算机程序在由处理器执行时导致权利要求1至3中任一项所述的方法被执行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111129306.3A CN113849309B (zh) | 2021-09-26 | 2021-09-26 | 一种业务对象的内存分配方法以及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111129306.3A CN113849309B (zh) | 2021-09-26 | 2021-09-26 | 一种业务对象的内存分配方法以及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113849309A CN113849309A (zh) | 2021-12-28 |
CN113849309B true CN113849309B (zh) | 2022-09-16 |
Family
ID=78979667
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111129306.3A Active CN113849309B (zh) | 2021-09-26 | 2021-09-26 | 一种业务对象的内存分配方法以及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113849309B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117349028B (zh) * | 2023-12-01 | 2024-02-27 | 苏州元脑智能科技有限公司 | 一种内存容量调整方法、装置、电子设备和存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1653430A (zh) * | 2002-05-07 | 2005-08-10 | 甲骨文国际公司 | 编程对象简化的内存重新分配 |
CN1653418A (zh) * | 2002-05-07 | 2005-08-10 | 甲骨文国际公司 | 向作为不同类实例的对象提供通用内存管理代码 |
CN103218360A (zh) * | 2012-01-18 | 2013-07-24 | 中国石油天然气集团公司 | 工业实时数据库采用内存池技术实现动态内存管理的方法 |
CN103914265A (zh) * | 2014-04-09 | 2014-07-09 | 江苏物联网研究发展中心 | 集群细粒度内存管理方法 |
CN109522113A (zh) * | 2018-09-28 | 2019-03-26 | 迈普通信技术股份有限公司 | 一种内存管理方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102968378B (zh) * | 2012-10-23 | 2016-06-15 | 融创天下(上海)科技发展有限公司 | 一种内存分配和释放的方法、装置及系统 |
US11074179B2 (en) * | 2017-11-02 | 2021-07-27 | Hewlett Packard Enterprise Development Lp | Managing objects stored in memory |
CN111367671B (zh) * | 2020-03-03 | 2023-12-29 | 深信服科技股份有限公司 | 一种内存分配方法、装置、设备及可读存储介质 |
-
2021
- 2021-09-26 CN CN202111129306.3A patent/CN113849309B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1653430A (zh) * | 2002-05-07 | 2005-08-10 | 甲骨文国际公司 | 编程对象简化的内存重新分配 |
CN1653418A (zh) * | 2002-05-07 | 2005-08-10 | 甲骨文国际公司 | 向作为不同类实例的对象提供通用内存管理代码 |
CN103218360A (zh) * | 2012-01-18 | 2013-07-24 | 中国石油天然气集团公司 | 工业实时数据库采用内存池技术实现动态内存管理的方法 |
CN103914265A (zh) * | 2014-04-09 | 2014-07-09 | 江苏物联网研究发展中心 | 集群细粒度内存管理方法 |
CN109522113A (zh) * | 2018-09-28 | 2019-03-26 | 迈普通信技术股份有限公司 | 一种内存管理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN113849309A (zh) | 2021-12-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109343963B (zh) | 一种容器集群的应用访问方法、装置及相关设备 | |
US11474972B2 (en) | Metadata query method and apparatus | |
CN106294190B (zh) | 一种存储空间管理方法及装置 | |
CN109690498B (zh) | 内存管理方法和设备 | |
CN106682215B (zh) | 一种数据处理方法和管理节点 | |
CN107066498B (zh) | 键值kv存储方法和装置 | |
CN107533508B (zh) | 用于减少压缩存储器时的存储器承诺用量的方法和系统 | |
US20170126779A1 (en) | Determining variable chunk size for transfer of a file | |
CN113849309B (zh) | 一种业务对象的内存分配方法以及装置 | |
CN112256433B (zh) | 基于Kafka集群的分区迁移方法和装置 | |
KR102114245B1 (ko) | 그래픽스 상태 관리 장치 및 방법 | |
CN114168490A (zh) | 确定内存回收阈值的方法及相关设备 | |
CN111857539A (zh) | 用于管理存储系统的方法、设备和计算机程序产品 | |
CN114327917A (zh) | 内存管理方法、计算设备及可读存储介质 | |
CN115712500A (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
CN115039091A (zh) | 多键值命令的处理方法、装置、电子设备及存储介质 | |
CN110162395B (zh) | 一种内存分配的方法及装置 | |
CN111338981B (zh) | 一种内存防碎片方法、系统及储存介质 | |
CN111488128B (zh) | 一种元数据的更新方法、装置、设备及介质 | |
US20210374048A1 (en) | Method, electronic device, and computer program product for storage management | |
US9697048B2 (en) | Non-uniform memory access (NUMA) database management system | |
US10152258B1 (en) | Big block allocation of persistent main memory | |
CN112346848A (zh) | 一种管理内存池的方法、装置及终端 | |
CN113326262B (zh) | 基于键值数据库的数据处理方法、装置、设备及介质 | |
CN111581157B (zh) | 一种对象存储平台以及对象操作方法、装置和服务器 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |