CN109597683A - 内存管理方法、装置、设备及存储介质 - Google Patents
内存管理方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN109597683A CN109597683A CN201810966811.5A CN201810966811A CN109597683A CN 109597683 A CN109597683 A CN 109597683A CN 201810966811 A CN201810966811 A CN 201810966811A CN 109597683 A CN109597683 A CN 109597683A
- Authority
- CN
- China
- Prior art keywords
- segment
- memory
- global variable
- rebuild
- reconstruction
- 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.)
- Granted
Links
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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本公开实施例公开了一种内存管理方法、装置、设备及存储介质。该方法包括:在满足预设条件时,获取全局变量的元素及占用内存;根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。本公开实施例挤掉了内存碎片,解决了内存不释放问题,程序运行过程中内存的增加不再超过增量数据带来的实际内存占用,避免了大量不符合预期的物理内存占用。
Description
技术领域
本公开实施例涉及计算机技术,尤其涉及一种内存管理方法、装置、设备及存储介质。
背景技术
随着互联网技术和信息技术的发展,智能手机等终端设备几乎已经成为每个人必备的设备,用户通过智能手机可以查看各种信息,因此,很多应用为了满足用户的需求,向用户推荐新闻等各种信息。
随着业务发展和推送策略的日益复杂,信息推送系统的内存开始成为瓶颈。在信息推送系统的运行过程中,会不断添加新的用户数据或更新已有的数据,导致占用的物理内存逐渐增多,而且内存增量远超过实际增量数据应该使用的内存,即存在内存不释放问题。
发明内容
有鉴于此,本公开实施例提供一种内存管理方法、装置、设备及存储介质,以至少地解决上述问题。
第一方面,本公开实施例提供了一种内存管理方法,所述方法包括:
在满足预设条件时,获取全局变量的元素及占用内存;
根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
可选的,在满足预设条件时,获取全局变量的元素及占用内存之前,还包括:
根据预设原则,将所述全局变量分为至少两个片段;
根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存,包括:
重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存。
可选的,重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存,包括:
生成一个片段,作为重建片段,所述重建片段包括起始内存地址;
根据所述至少两个片段中每个片段中的元素,基于所述起始内存地址重新申请内存并将所述元素复制到重新申请的内存中,在一个片段中的所有元素复制完成后释放该片段对应的重建前的占用内存,并在所述重建片段中的元素符合所述预设原则时新生成一个重建片段。
可选的,还包括:
通过至少两个链表指针将所述至少两个片段串联成链表,所述至少两个链表指针指向对应的片段的内存地址;
在一个片段重建完成后释放对应的重建前的占用内存之后,还包括:
根据重建后的片段的内存地址,修改对应的链表指针所指向的内存地址。
可选的,还包括:
当获取到新元素时,将所述新元素写入所述链表的最后一个片段。
可选的,所述链表的读写机制包括:最后一个片段外的其他片段不允许写入新元素,允许对已有元素的更新。
可选的,还包括:
在读写最后一个片段时进行加锁,并在读写完毕时释放锁。
可选的,还包括:
当所述最后一个片段符合预设原则时,新生成一个片段,并通过对应的链表指针将新生成的片段追加到链表尾部,所述新生成的片段用于接收后续写入的元素。
可选的,所述预设原则包括预设元素数量。
第二方面,本公开实施例还提供了一种内存管理装置,所述装置包括:
数据获取模块,用于在满足预设条件时,获取全局变量的元素及占用内存;
全局变量重建模块,用于根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
可选的,还包括:
全局变量划分模块,用于在满足预设条件时,获取全局变量的元素及占用内存之前,根据预设原则,将所述全局变量分为至少两个片段;
相应的,所述全局变量重建模块包括:
重建单元,用于重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存。
可选的,所述重建单元具体用于:
生成一个片段,作为重建片段,所述重建片段包括起始内存地址;
根据所述至少两个片段中每个片段中的元素,基于所述起始内存地址重新申请内存并将所述元素复制到重新申请的内存中,在一个片段中的所有元素复制完成后释放该片段对应的重建前的占用内存,并在所述重建片段中的元素符合所述预设原则时新生成一个重建片段。
可选的,还包括:
链表形成模块,用于通过至少两个链表指针将所述至少两个片段串联成链表,所述至少两个链表指针指向对应的片段的内存地址;
所述全局变量重建模块还包括:
链表指针修改单元,用于根据重建后的片段的内存地址,修改对应的链表指针所指向的内存地址。
可选的,还包括:
新元素写入模块,用于当获取到新元素时,将所述新元素写入所述链表的最后一个片段。
可选的,所述链表的读写机制包括:最后一个片段外的其他片段不允许写入新元素,允许对已有元素的更新。
可选的,还包括:
锁保护模块,用于在读写最后一个片段时进行加锁,并在读写完毕时释放锁。
可选的,还包括:
片段生成模块,用于当所述最后一个片段符合预设原则时,新生成一个片段,并通过对应的链表指针将新生成的片段追加到链表尾部,所述新生成的片段用于接收后续写入的元素。
可选的,所述预设原则包括预设元素数量。
第三方面,本公开实施例还提供了一种设备,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本公开任一实施例所述的内存管理方法。
第四方面,本公开实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现本公开任一实施例所述的内存管理方法。
本公开实施例的技术方案,通过在满足预设条件时获取全局变量的元素及占用内存,重新申请内存对全局变量进行重建,并释放所述占用内存,从而挤掉了内存碎片,解决了内存不释放问题,程序运行过程中内存的增加不再超过增量数据带来的实际内存占用,避免了大量不符合预期的物理内存占用。
附图说明
图1是本公开实施例提供的一种内存管理方法的流程图;
图2是本公开实施例提供的一种内存管理方法的流程图;
图3是本公开实施例提供的一种内存管理装置的结构示意图;
图4是本公开实施例提供的一种设备的硬件结构示意图。
具体实施方式
下面结合附图和实施例对本公开作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本公开,而非对本公开的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本公开相关的部分而非全部内容。
信息推送系统中需要将数据全部加载进内存,而不是每次推送任务都扫描一遍本地数据库,内存中存储数据的格式复用了protobuf,即内存中需要存储全部数据。其中,protobuf(Google Protocol Buffers)是google开发的一套用于数据存储,网络通信时用于协议编解码的工具库。
信息推送系统中使用一个全局变量来存储用户状态数据,全局变量的数据类型可以抽象为一个数组,其中每个元素为一个用户状态数据,每个用户状态数据为一个protobuf对象,其中,protobuf对象是通过.proto文件生成的java对象,.proto文件定义程序中需要处理的结构化数据,在protobuf的术语中,结构化数据被称为Message。用户状态数据包括:用户画像(User Profile)、地理位置信息以及推送消息列表等等。全局变量非常大,在信息推送系统启动时占用内存较多,信息推送系统运行过程中不断往全局变量中添加新元素或更新已有元素的属性。每个元素是一个protobuf消息,每个消息含有多个重复字段,每次更新时会对重复字段做增删操作,如当产生一条新推送消息时会往用户推送消息列表追加一条新数据,当用户的画像更新时会对现有画像做更新及合并等操作。由于不断有新元素插入和旧元素内重复字段扩容及修改操作,全局变量占用的物理内存会增多,信息推送系统运行一段时间后,内存增量远超过实际增量数据应该使用的内存,即产生了大量内存碎片,导致OOM(Out Of Memory,内存溢出),存在内存不释放问题。
例如,在信息推送系统初始化时,根据需要的元素数,则分配对应的内存空间,在1个元素中以10个数据为临界点,当该元素中的数据量超过10时,则扩容到20个数据,而在业务量较少的时段(如晚上12点),会对过期的数据进行清理,假设有5个过期数据,则清理后实际只有15个数据,还有5个数据的空间,这时若有10个新数据加进来,则5个数据的空间不能容纳这10个新数据,这时候需要重新分配10个数据的空间来容纳新加入的数据,从而导致5个数据的空间浪费,即产生了内存碎片,则多个元素中会有大量内存碎片,导致占用的内存远超过增量数据应该使用的内存,即存在OOM(Out Of Memory,内存溢出)或内存不释放问题。
本公开的申请人通过对上述应用场景的特点、数据变化和维护情况进行分析和实际测量,发现了在信息推送等数据更新较多容易产生内存碎片的类似场景下,存在内存不释放的问题,并针对该问题,给出了以下的技术方案,来挤掉内存碎片,以解决内存不释放问题或OOM。
图1是本公开实施例提供的一种内存管理方法的流程图,本实施例可适用于对全局变量所占用的内存进行管理的情况,该方法可以由内存管理装置来执行,该装置可以由软件和/或硬件来实现,一般可集成在计算机或服务器等设备中。如图1所示,该方法具体包括如下步骤:
步骤110,在满足预设条件时,获取全局变量的元素及占用内存。
其中,预设条件是预先设置的用于重建全局变量的触发条件,可以是到达预设时间或者业务量小于预设阈值。在设置预设时间时,具体可根据业务需求进行设置,可以设置在业务量较小的时间,如晚上12点,具体的,可以统计预设时间段(如一个月)内的业务量,选取业务量最小的时间点为所述预设时间。还可以监测实时业务量,如监测到某一时刻的业务量小于预设阈值,则可以在该时刻触发全局变量的重建。所述全局变量主要用于存储前述的用户状态数据。占用内存可以使用内存地址进行表示。
在预设条件为到达预设时间时,可以根据设备内部的计时或系统时间确定是否到达预设时间。在预设条件为业务量小于预设阈值时,可以监测实时业务量,并与预设阈值进行比较,在实时业务量小于预设阈值时,确定满足预设条件。在满足预设条件时,重建全局变量,从而重新整理内存,将尽量多的内存碎片归还给操作系统。在重建全局变量时,要重建整个全局变量,而不能只重建全局变量内的元素,这就需要重新申请内存来重建该全局变量。在重建全局变量时,需要获取全局变量的元素及占用内存,便于进行全局变量的重建及重建后释放占用内存。
步骤120,根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
重新申请一块内存对全局变量进行重建,即复制全局变量的元素到重新申请的内存中,并将各个元素紧密排列,从而挤掉内存碎片,之后释放全局变量重建前的占用内存。重新申请的内存,由于是依据全局变量的元素来申请的,因此是与全局变量的数据量(包括增量数据和原有数据)相匹配的,挤掉了由于数据维护带来的内存碎片,因此,使得程序运行过程中内存的增加不再超过增量数据带来的实际内存占用,避免了大量不符合预期的物理内存占用。
本实施例的技术方案,通过在满足预设条件时获取全局变量的元素及占用内存,重新申请内存对全局变量进行重建,并释放所述占用内存,从而挤掉了内存碎片,解决了内存不释放问题,程序运行过程中内存的增加不再超过增量数据带来的实际内存占用,避免了大量不符合预期的物理内存占用。
在上述技术方案的基础上,在到达预设时间时,获取全局变量的元素及占用内存之前,还可选包括:
根据预设原则,将所述全局变量分为至少两个片段;
根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存,包括:
重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存。
由于直接重建整个全局变量,会导致内存占用短期内急剧增加,对于处于OOM边缘的信息推送系统来说是不能容忍的,基于此,根据预设原则将全局变量分为多个片段,并单独对每个片段进行重建,在一个片段重建完成后及时释放该片段重建前的占用内存,避免了重建过程中的OOM问题。可选的,所述预设原则包括预设元素数量或者预设内存大小,优选为预设元素数量。通过将全局变量分为多个片段,每个片段包含的元素数量相同,均为预设元素数量,保证在后续重建时不会产生新的内存碎片,而且可以提高读写性能。
可选的,重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存,包括:
生成一个片段,作为重建片段,所述重建片段包括起始内存地址;
根据所述至少两个片段中每个片段中的元素,基于所述起始内存地址重新申请内存并将所述元素复制到重新申请的内存中,在一个片段中的所有元素复制完成后释放该片段对应的重建前的占用内存,并在所述重建片段中的元素符合所述预设原则时新生成一个重建片段。
在后续重建全局变量时,可以按照片段中的元素对该片段进行重建,即首先生成一个重建片段,该重建片段中指定了该重建片段的起始内存地址,以接收重建时复制的元素,之后根据待重建的片段中的第一个元素的实际占用内存,基于重建片段的起始内存地址重新申请一块对应大小的内存,并将第一个元素复制到重新申请的内存中,之后根据待重建的片段中的第二个元素的实际占用内存,紧邻复制的第一个元素的内存地址重新申请一块对应大小的内存,并将第二个元素复制到重新申请的内存中,以此进行一个片段中每个元素的重建,并在一个片段中的所有元素复制完成后,释放该片段对应的重建前的占用内存。其中,重建时复制的元素为有效的元素,而无效的元素则无需复制。在将一个片段中的所有有效元素重建完成后,如果重建片段中的元素不符合所述预设原则,则在对第二个片段中的元素进行重建时,将第二个片段中的元素复制到紧邻该重新申请的内存中的最后一个元素的内存地址的内存中;在重建片段中的元素符合预设原则时,重新生成一个重建片段,以接收后续复制的元素。示例性的,在重建片段中的元素数量达到预设元素数量时,这些元素填满了整个重建片段,则重新生成一个重建片段,再对之后的元素进行重建,基于重新生成的重建片段的起始内存地址,重新申请内存对之后的元素进行重建,重新生成的重建片段的内存与之前形成的重建片段的内存可以紧密相邻,也可以不相邻。通过将全局变量分为片段并在重建时针对每个片段进行重建,及时释放重建完成的片段所占内存,挤掉了内存碎片,而且避免了大量占用临时内存,可以解决OOM问题。
例如,原来有A、B和C三个片段,每个片段里有10个元素,那么在满足预设条件时开始重建任务,会开始扫描A、B和C三个片段,将其中仍然有效(每个旧段中仍然有效的数据可能少于10个)的元素往重建片段里复制,以进行重建,在复制时,针对元素进行单独申请内存并单独复制,当重建片段中的元素达到10个时,才生成另一个重建片段。重建完成后,假如A、B和C三个片段中总共只有20个元素仍有效,那么会重建出2个重建片段;假如有26个元素有效,那么会重建出3个重建片段,前两个片段各有10个元素,但最后一个片段只有6个元素。
图2是本公开实施例提供的一种内存管理方法的流程图,本实施例可以与上述一个或者多个实施例中各个可选方案结合,可选的,将所述至少两个片段串联成链表。如图2所示,该方法具体包括如下步骤:
步骤210,根据预设原则,将所述全局变量分为至少两个片段。
对全局变量划分片段时,根据预设原则进行划分,例如可以根据可用内存大小确定划分的片段数量,或者是预设元素数量的元素划分为一个片段。在将预设元素数量的元素划分为一个片段时,每个片段存储固定数量的元素,可以提高读写性能。
步骤220,通过至少两个链表指针将所述至少两个片段串联成链表,所述至少两个链表指针指向对应的片段的内存地址。
全局变量分成至少两个片段,每个片段是一个指针变量,指针内部有一个数组属性用来存储具体数据,每个片段存储预设数量的元素,即每个片段存储的元素数量是固定的。由于全局变量中的数据有增量,而在程序启动时并不知道将来可能的数据增量,所以不用数组来存储数据,因为普通的数组在扩容时会导致迭代器失效,即在扩容时都要复制一遍,读取操作有多线程不安全问题,导致复制的过程可能出错,带来较大的维护代价,因此,本公开实施例用链表的形式来存储全局变量,可以串联更多的片段来存储数据增量。
在所述链表中,由一个链表指针指向对应的片段的内存地址,一个链表指针对应一个片段,链表中存储的是链表指针,由链表指针串联了各个片段。
步骤230,在满足预设条件时,获取全局变量的元素及占用内存。
在到达预设时间时,对全局变量进行重建,在重建时,按照链表中的每个片段单独进行重建,从而不必整体重建整个全局变量,避免大量占用临时内存。
步骤240,重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存,根据重建后的片段的内存地址,修改对应的链表指针所指向的内存地址。
在重建每个片段时,需要重建整个片段,而不能只重建片段中的数据,因为只重建数据是在原来已经碎片化比较严重的内存上尝试分配内存,无法达到释放物理内存的目的,而重建整个片段是需要重新申请一块内存的,这样才可以释放物理内存碎片。重建片段是需要重新申请内存的,并将片段中的数据复制到重新申请的内存中,释放原有内存;而重建片段中的数据,不需要重新申请内存,而是在片段已有的内存中尝试分配内存来容纳重建的数据,因此,在片段已经碎片化严重时,无法达到释放物理内存的目的。
示例性的,在对全局变量进行重建时,获取全局变量中第一个片段的元素,生成一个片段,作为第一个重建片段,所述第一个重建片段中包括起始内存地址,对第一个片段进行重建,将第一个片段的有效元素依次复制到第一个重建片段中,完成第一个片段的重建,释放第一个片段所占用的内存,线程安全地将第一个片段的链表指针所指向的内存地址替换为第一个重建片段的内存地址。在预设原则为预设元素数量时,重建后的片段的元素数量也是固定的,仍为预设元素数量。在重建第一个片段得到第一个重建片段后,如果第一个重建片段的元素数量没有达到预设元素数量,在重建全局变量中的第二个片段时,可将第二个片段的部分元素复制到第一个重建片段中,如果第一个重建片段不能容纳第二个片段的所有元素,则再生成一个片段,作为第二个重建片段,将第二个片段的剩余的有效元素依次复制到第二个重建片段中,释放第二个片段所占用的内存,线程安全地将第二个片段的链表指针所指向的内存地址替换为第二个重建片段的内存地址,与此类似,重建全局变量中的其他片段。
本实施例的技术方案,通过将全局变量分为至少两个片段,并通过至少两个链表指针将至少两个片段串联成链表,按照全局变量中每个片段在链表中的顺序,重新申请内存对全局变量中的每个片段进行重建,并在一个片段重建完成后,释放该片段所占用的内存并修改对应的链表指针所指向的内存地址,释放了内存碎片所占用的物理内存,而且避免了占用大量临时内存,解决了内存不释放问题和OOM问题,而且通过重建片段后修改指针所指向的内存地址,可以减少需要同步保护的时间。
在上述技术方案的基础上,还可选包括:
当获取到新元素时,将所述新元素写入所述链表的最后一个片段。
可选的,所述链表的读写机制包括:最后一个片段外的其他片段不允许写入新元素,允许对已有元素的更新。预先设置链表的读写机制,即链表中只允许最后一个片段写入新元素,禁止向其他片段写入新元素及删减元素,只允许对其他片段中已有元素的属性进行更新,可以避免大量的需要线程同步的问题。
当有新元素写入链表时,将新元素写入链表的最后一个片段,可以减少大量需要读写同步的场景。
在上述技术方案的基础上,还可选包括:
在读写最后一个片段时进行加锁,并在读写完毕时释放锁。
由于预先设置的链表的读写机制是除了最后一个片段外,其他片段不再允许写入新元素,所以读取其他片段都是线程安全的,无需加锁,而为了保证最后一个片段的线程安全,在有线程读写最后一个片段时进行加锁,避免其他线程同时对该最后一个片段进行读写产生脏数据或者丢失数据,并在读写完毕时释放锁,以供其他线程进行读写,保证数据读取效率。通过锁保护来减少锁粒度,降低对性能的影响。
在上述技术方案的基础上,还可选包括:
当所述最后一个片段符合预设原则时,新生成一个片段,并通过对应的链表指针将新生成的片段追加到链表尾部,所述新生成的片段用于接收后续写入的元素。
在最后一个片段符合预设原则时触发扩容,新生成一个片段,并通过与该新生成的片段对应的链表指针将新生成的片段追加到链表尾部,后续写入的元素写入该新生成的片段中,保证各个片段的元素数量固定。示例性的,在最后一个片段中的元素数量达到预设元素数量时触发扩容,新生成一个片段。
通过上述锁保护及设定的链表的读写机制,保证了对链表中片段读写的线程安全,及对片段重建过程的线程安全。
图3是本公开实施例提供的一种内存管理装置的结构示意图,本实施例可适用于对全局变量所占用的内存进行管理的情况,该装置可以执行内存管理方法,该装置可以由软件和/或硬件来实现,一般可集成在计算机或服务器等设备中。如图3所示,本实施例所述的内存管理装置包括:数据获取模块310和全局变量重建模块320。
其中,数据获取模块310,用于在满足预设条件时,获取全局变量的元素及占用内存;
全局变量重建模块320,用于根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
可选的,还包括:
全局变量划分模块,用于在满足预设条件时,获取全局变量的元素及占用内存之前,根据预设原则,将所述全局变量分为至少两个片段;
相应的,所述全局变量重建模块包括:
重建单元,用于重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存。
可选的,所述重建单元具体用于:
生成一个片段,作为重建片段,所述重建片段包括起始内存地址;
根据所述至少两个片段中每个片段中的元素,基于所述起始内存地址重新申请内存并将所述元素复制到重新申请的内存中,在一个片段中的所有元素复制完成后释放该片段对应的重建前的占用内存,并在所述重建片段中的元素符合所述预设原则时新生成一个重建片段。
可选的,还包括:
链表形成模块,用于通过至少两个链表指针将所述至少两个片段串联成链表,所述至少两个链表指针指向对应的片段的内存地址;
所述全局变量重建模块还包括:
链表指针修改单元,用于根据重建后的片段的内存地址,修改对应的链表指针所指向的内存地址。
可选的,还包括:
新元素写入模块,用于当获取到新元素时,将所述新元素写入所述链表的最后一个片段。
可选的,所述链表的读写机制包括:最后一个片段外的其他片段不允许写入新元素,允许对已有元素的更新。
可选的,还包括:
锁保护模块,用于在读写最后一个片段时进行加锁,并在读写完毕时释放锁。
可选的,还包括:
片段生成模块,用于当所述最后一个片段符合预设原则时,新生成一个片段,并通过对应的链表指针将新生成的片段追加到链表尾部,所述新生成的片段用于接收后续写入的元素。
可选的,所述预设原则包括预设元素数量。
上述内存管理装置可执行本公开任意实施例所提供的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本公开任意实施例提供的内存管理方法。
图4是本公开实施例提供的一种设备的硬件结构示意图。设备可以以各种形式来实施,本公开中的设备可以包括但不限于诸如移动电话、智能电话、笔记本电脑、数字广播接收器、PDA(Personal Digital Assistant,个人数字助理)、PAD(平板电脑)、PMP(Portable Multimedia Player,便携式多媒体播放器)、导航装置、车载终端设备、车载显示终端、车载电子后视镜等等的移动终端设备以及诸如数字TV、台式计算机、服务器等等的固定设备。
如图4所示,设备400可以包括无线通信单元410、A/V(音频/视频)输入单元420、用户输入单元430、感测单元440、输出单元450、存储器460、接口单元470、处理器480和电源单元490等等。图4示出了具有各种组件的设备,但是应理解的是,并不要求实施所有示出的组件,可以替代地实施更多或更少的组件。
其中,无线通信单元410允许设备400与无线通信系统或网络之间的无线电通信。A/V输入单元420用于接收音频或视频信号。用户输入单元430可以根据用户输入的命令生成键输入数据以控制设备的各种操作。感测单元440检测设备400的当前状态、设备400的位置、用户对于设备400的触摸输入的有无、设备400的取向、设备400的加速或减速移动和方向等等,并且生成用于控制设备400的操作的命令或信号。接口单元470用作至少一个外部装置与设备400连接可以通信的接口。输出单元450被构造为以视觉、音频和/或触觉方式提供输出信号。存储器460可以存储由处理器480执行的处理和控制操作的软件程序等等,或者可以暂时地存储己经输出或将要输出的数据。存储器460可以包括至少一种类型的存储介质。而且,设备400可以与通过网络连接执行存储器460的存储功能的网络存储装置协作。处理器480通常控制设备的总体操作。另外,处理器480可以包括用于再现或回放多媒体数据的多媒体模块。处理器480可以执行模式识别处理,以将在触摸屏上执行的手写输入或者图片绘制输入识别为字符或图像。电源单元490在处理器480的控制下接收外部电力或内部电力并且提供操作各元件和组件所需的适当的电力。
处理器480通过运行存储在存储器460中的程序,从而执行设备400的各种功能应用以及数据处理,例如实现本公开实施例所提供的一种内存管理方法,包括:
在满足预设条件时,获取全局变量的元素及占用内存;
根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
本公开实施例还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种内存管理方法,该方法包括:
在满足预设条件时,获取全局变量的元素及占用内存;
根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
当然,本公开实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本公开任意实施例所提供的内存管理方法中的相关操作。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本公开可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述的方法。
值得注意的是,上述内存管理装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本公开的保护范围。
注意,上述仅为本公开的较佳实施例及所运用技术原理。本领域技术人员会理解,本公开不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本公开的保护范围。因此,虽然通过以上实施例对本公开进行了较为详细的说明,但是本公开不仅仅限于以上实施例,在不脱离本公开构思的情况下,还可以包括更多其他等效实施例,而本公开的范围由所附的权利要求范围决定。
Claims (13)
1.一种内存管理方法,其特征在于,所述方法包括:
在满足预设条件时,获取全局变量的元素及占用内存;
根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
2.根据权利要求1所述的方法,其特征在于,在满足预设条件时,获取全局变量的元素及占用内存之前,还包括:
根据预设原则,将所述全局变量分为至少两个片段;
根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存,包括:
重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存。
3.根据权利要求2所述的方法,其特征在于,重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存,包括:
生成一个片段,作为重建片段,所述重建片段包括起始内存地址;
根据所述至少两个片段中每个片段中的元素,基于所述起始内存地址重新申请内存并将所述元素复制到重新申请的内存中,在一个片段中的所有元素复制完成后释放该片段对应的重建前的占用内存,并在所述重建片段中的元素符合所述预设原则时新生成一个重建片段。
4.根据权利要求2所述的方法,其特征在于,还包括:
通过至少两个链表指针将所述至少两个片段串联成链表,所述至少两个链表指针指向对应的片段的内存地址;
在一个片段重建完成后释放对应的重建前的占用内存之后,还包括:
根据重建后的片段的内存地址,修改对应的链表指针所指向的内存地址。
5.根据权利要求4所述的方法,其特征在于,还包括:
当获取到新元素时,将所述新元素写入所述链表的最后一个片段。
6.根据权利要求5所述的方法,其特征在于,所述链表的读写机制包括:最后一个片段外的其他片段不允许写入新元素,允许对已有元素的更新。
7.根据权利要求5所述的方法,其特征在于,还包括:
在读写最后一个片段时进行加锁,并在读写完毕时释放锁。
8.根据权利要求5所述的方法,其特征在于,还包括:
当所述最后一个片段符合预设原则时,新生成一个片段,并通过对应的链表指针将新生成的片段追加到链表尾部,所述新生成的片段用于接收后续写入的元素。
9.根据权利要求2所述的方法,其特征在于,所述预设原则包括预设元素数量。
10.一种内存管理装置,其特征在于,所述装置包括:
数据获取模块,用于在满足预设条件时,获取全局变量的元素及占用内存;
全局变量重建模块,用于根据所述全局变量的元素,重新申请内存以对所述全局变量进行重建,并释放所述占用内存。
11.根据权利要求10所述的装置,其特征在于,还包括:
全局变量划分模块,用于在满足预设条件时,获取全局变量的元素及占用内存之前,根据预设原则,将所述全局变量分为至少两个片段;
所述全局变量重建模块包括:
重建单元,用于重新申请内存对所述至少两个片段中的每个片段单独进行重建,并在一个片段重建完成后释放对应的重建前的占用内存。
12.一种设备,其特征在于,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-9任一所述的内存管理方法。
13.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1-9任一所述的内存管理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810966811.5A CN109597683B (zh) | 2018-08-23 | 2018-08-23 | 内存管理方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810966811.5A CN109597683B (zh) | 2018-08-23 | 2018-08-23 | 内存管理方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109597683A true CN109597683A (zh) | 2019-04-09 |
CN109597683B CN109597683B (zh) | 2021-05-07 |
Family
ID=65956566
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810966811.5A Active CN109597683B (zh) | 2018-08-23 | 2018-08-23 | 内存管理方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109597683B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110286909A (zh) * | 2019-06-29 | 2019-09-27 | 潍柴动力股份有限公司 | Simulink模型资源使用数据的统计方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101404028A (zh) * | 2008-11-07 | 2009-04-08 | 宇龙计算机通信科技(深圳)有限公司 | 一种整理文件碎片的方法和系统 |
US20120216096A1 (en) * | 2011-02-23 | 2012-08-23 | Seo Man-Keun | Memory Device and Memory System |
CN103870259A (zh) * | 2012-12-14 | 2014-06-18 | 腾讯科技(深圳)有限公司 | 数据处理方法及装置 |
CN104598390A (zh) * | 2011-11-14 | 2015-05-06 | 北京奇虎科技有限公司 | 一种数据存储方法及装置 |
US20160154731A1 (en) * | 2013-01-18 | 2016-06-02 | International Business Machines Corporation | Re-aligning a compressed data array |
CN105874440A (zh) * | 2014-01-02 | 2016-08-17 | 高通股份有限公司 | 用于对存储器进行碎片整理的系统和方法 |
-
2018
- 2018-08-23 CN CN201810966811.5A patent/CN109597683B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101404028A (zh) * | 2008-11-07 | 2009-04-08 | 宇龙计算机通信科技(深圳)有限公司 | 一种整理文件碎片的方法和系统 |
US20120216096A1 (en) * | 2011-02-23 | 2012-08-23 | Seo Man-Keun | Memory Device and Memory System |
CN104598390A (zh) * | 2011-11-14 | 2015-05-06 | 北京奇虎科技有限公司 | 一种数据存储方法及装置 |
CN103870259A (zh) * | 2012-12-14 | 2014-06-18 | 腾讯科技(深圳)有限公司 | 数据处理方法及装置 |
US20160154731A1 (en) * | 2013-01-18 | 2016-06-02 | International Business Machines Corporation | Re-aligning a compressed data array |
CN105874440A (zh) * | 2014-01-02 | 2016-08-17 | 高通股份有限公司 | 用于对存储器进行碎片整理的系统和方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110286909A (zh) * | 2019-06-29 | 2019-09-27 | 潍柴动力股份有限公司 | Simulink模型资源使用数据的统计方法及装置 |
CN110286909B (zh) * | 2019-06-29 | 2023-01-24 | 潍柴动力股份有限公司 | Simulink模型资源使用数据的统计方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109597683B (zh) | 2021-05-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11442961B2 (en) | Active transaction list synchronization method and apparatus | |
JP5966927B2 (ja) | 分散処理装置及び分散処理システム | |
CN109032796B (zh) | 一种数据处理方法和装置 | |
CN105339885B (zh) | 磁盘上数据的小随机更改的高效存储 | |
CN104937564B (zh) | 组表格的数据冲洗 | |
CN103645970B (zh) | 一种远程复制多快照间增量去重的实现方法及装置 | |
US9454481B2 (en) | Affinity group access to global data | |
CN104854582B (zh) | 存储高效、更新优化的事务型全文索引视图维护的方法和系统 | |
CN103150267B (zh) | 一种多控制器间的缓存同步方法 | |
CN108369547B (zh) | 用于管理持久性主存储器中的日志的尾部的系统和方法 | |
CN108763572A (zh) | 一种实现Apache Solr读写分离的方法和装置 | |
CN106357703B (zh) | 集群切换方法与设备 | |
CN101763433B (zh) | 一种数据存储系统及方法 | |
CN114780025B (zh) | 软件raid请求处理方法、控制器及raid存储系统 | |
CN111031100A (zh) | 一种扩展的区块链存储方法、系统及介质 | |
CN109597683A (zh) | 内存管理方法、装置、设备及存储介质 | |
CN104572483B (zh) | 动态内存管理装置及方法 | |
CN116069685B (zh) | 一种存储系统写控制方法、装置、设备及可读存储介质 | |
CN108984779A (zh) | 分布式文件系统快照回滚元数据处理方法、装置及设备 | |
US11341159B2 (en) | In-stream data load in a replication environment | |
CN112269535A (zh) | 存储系统的空间资源分配方法、装置及可读存储介质 | |
CN116126234A (zh) | 数据同步方法、装置、设备、存储介质和程序产品 | |
CN109213636A (zh) | 一种存储快照创建方法、装置、设备及存储介质 | |
CN109240773A (zh) | 解决房间串数据的方法、装置、终端及可读存储介质 | |
CN105183738A (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 |