一种内存管理方法及系统

阅读: 评论:0

著录项
  • CN201610987681.4
  • 20161109
  • CN108062247A
  • 20180522
  • 腾讯科技(深圳)有限公司
  • 刘海鹏
  • G06F9/50
  • G06F9/50

  • 广东省深圳市福田区振兴路赛格科技园2栋东403室
  • 广东(44)
  • 广州三环专利商标代理有限公司
  • 郝传鑫;贾允
摘要
本发明公开了一种内存管理方法及系统,属于互联网技术领域。方法包括:向操作系统申请指定大小的内存作为预留内存;设置目标覆盖函数;通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并将截获的请求发送给操作系统;通过目标覆盖函数监控操作系统对请求的响应结果;根据响应结果判断向操作系统申请内存是否成功;若否,则将预留内存归还给操作系统;通过目标覆盖函数重新向操作系统发送申请内存的请求。本发明覆盖了各内存分配器向系统申请内存的过程,引入预留内存以解决内存分配器向操作系统申请内存失败报内存不足错误OOM的问题,从而在很大程度上减少了内存不足错误的发生频率。
权利要求

1.一种内存管理方法,其特征在于,包括:

向操作系统申请指定大小的内存作为预留内存;

设置目标覆盖函数;

通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并将截获的请求发 送给操作系统;

通过目标覆盖函数监控操作系统对所述请求的响应结果;

根据响应结果判断向操作系统申请内存是否成功;

若否,则将所述预留内存归还给操作系统;

通过目标覆盖函数重新向操作系统发送申请内存的请求。

2.根据权利要求1所述的内存管理方法,其特征在于,所述通过目标覆盖函数重新向操 作系统发送申请内存的请求后,还包括:

通知各内存分配器对应的内存控制模块回收内存。

3.根据权利要求1所述的内存管理方法,其特征在于,所述设置目标覆盖函数,包括:

将内存分配器向操作系统申请内存改为调用目标覆盖函数向操作系统申请内存。

4.根据权利要求1所述的内存管理方法,其特征在于,所述设置目标覆盖函数,包括:

建立包含所述目标覆盖函数的目标覆盖函数共享库,将所述目标覆盖函数命名为和操 作系统中的系统内存分配函数一致;所述系统内存分配函数用于响应申请内存的请求;

先加载所述目标覆盖函数共享库;

再加载所述系统内存分配函数所在的共享库。

5.根据权利要求1所述的内存管理方法,其特征在于,所述设置目标覆盖函数,包括:

建立包含中间函数的中间函数共享库,所述中间函数共享库与各内存分配器所在的共 享库静态连接;

将所述目标覆盖函数命名为和操作系统中的系统内存分配函数一致,所述目标覆盖函 数通过调用所述中间函数来调用所述系统内存分配函数;所述系统内存分配函数用于响应 申请内存的请求。

6.根据权利要求1所述的内存管理方法,其特征在于,所述通过目标覆盖函数重新向操 作系统发送申请内存的请求之后,还包括:

再次向操作系统申请指定大小的内存作为预留内存。

7.根据权利要求1所述的内存管理方法,其特征在于,所述通过目标覆盖函数重新向操 作系统发送申请内存的请求之后,还包括:

通过目标覆盖函数接收操作系统返回的内存分配结果。

8.根据权利要求1所述的内存管理方法,其特征在于,所述向操作系统申请指定大小的 内存作为预留内存,包括:向操作系统申请指定大小的内存作为预留内存,将所述预留内存 分配给指定预留内存持有者;

所述将所述预留内存归还给操作系统,包括:通知预留内存持有者释放所述预留内存。

9.一种内存管理系统,其特征在于,包括:

预留内存申请模块,用于向操作系统申请指定大小的内存作为预留内存;

目标覆盖函数设置模块,用于设置目标覆盖函数;

请求截获模块,用于通过目标覆盖函数截获各内存分配器向操作系统申请内存的请 求,并将截获的请求发送给操作系统;响应监控模块,用于通过目标覆盖函数监控操作系统 对所述请求的响应结果;

判断模块,用于根据响应结果判断向操作系统申请内存是否成功;

预留内存归还模块,用于将所述预留内存归还给操作系统;

内存申请模块,用于通过目标覆盖函数重新向操作系统发送申请内存的请求。

10.根据权利要求9所述的内存管理系统,其特征在于,还包括:

回收通知模块,用于通知各内存分配器对应的内存控制模块回收内存。

11.根据权利要求9所述的内存管理系统,其特征在于,还包括:

二次预留模块,用于再次向操作系统申请指定大小的内存作为预留内存。

12.根据权利要求11所述的内存管理系统,其特征在于,还包括:

结果接收模块,用于接收操作系统返回的内存分配结果。

13.根据权利要求11所述的内存管理系统,其特征在于,所述预留内存申请模块包括预 留内存分配单元,用于将所述预留内存分配给指定预留内存持有者。

14.根据权利要求13所述的内存管理系统,其特征在于,所述预留内存归还模块包括释 放通知单元,用于通知预留内存持有者释放所述预留内存。

说明书
技术领域

本发明涉及互联网技术领域,尤其涉及一种内存管理方法及系统。

以浏览器应用为代表的复杂应用,一般由多个模块组成,这些模块可能采用不同 的内存管理方式,使用不同的内存分配器,相互之间没有更多的了解,彼此向系统申请内存 也是缺乏协调的。这容易导致进程虚存空间的碎片及内存空间内存不足错误,或称OOM(Out Of Memory)错误。

现有技术中处理内存申请的过程如图1所示:

第一步:各内存分配器分别接收程序申请内存的请求;

第二步:各内存分配器分别处理内存请求,若响应失败,则向操作系统发出申请内 存的请求;

第三步,操作系统接收到内存分配器发送的请求后,处理请求,若处理失败,则报 内存不足错误(OOM)。

可见,现有技术中,一般仅在内存分配器内部设有处理内存碎片方案,以防止因为 内存碎片引起的内存不足,但是在各内存分配器与系统之间,并没有处理内存不足的技术 方案。

为了解决上述问题,本发明提供了一种内存管理方法及系统,用以解决内存分配 器向系统请求内存过程中内存不足的问题。

本发明实施例第一方面公开一种内存管理方法,包括:

向操作系统申请指定大小的内存作为预留内存;

设置目标覆盖函数;

通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并将截获的请 求发送给操作系统;

通过目标覆盖函数监控操作系统对所述请求的响应结果;

根据响应结果判断向操作系统申请内存是否成功;

若否,则将所述预留内存归还给操作系统;

通过目标覆盖函数重新向操作系统发送申请内存的请求。

进一步地,

所述通过目标覆盖函数重新向操作系统发送申请内存的请求后,还包括:

通知各内存分配器对应的内存控制模块回收内存。

进一步地,所述设置目标覆盖函数,包括:

将内存分配器向操作系统申请内存改为调用目标覆盖函数向操作系统申请内存。

可选地,所述设置目标覆盖函数,包括:

建立包含所述目标覆盖函数的目标覆盖函数共享库,将所述目标覆盖函数命名为 和操作系统中的系统内存分配函数一致;所述系统内存分配函数用于响应申请内存的请 求;

先加载所述目标覆盖函数共享库;

再加载所述系统内存分配函数所在的共享库。

可选地,所述设置目标覆盖函数,包括:

建立包含中间函数的中间函数共享库,所述中间函数共享库与各内存分配器所在 的共享库静态连接;

将所述目标覆盖函数命名为和操作系统中的系统内存分配函数一致,所述目标覆 盖函数通过调用所述中间函数来调用所述系统内存分配函数;所述系统内存分配函数用于 响应申请内存的请求。

进一步地,所述通过目标覆盖函数重新向操作系统发送申请内存的请求之后,还 包括:

再次向操作系统申请指定大小的内存作为预留内存。

进一步地,所述通过目标覆盖函数重新向操作系统发送申请内存的请求之后,还 包括:

通过目标覆盖函数接收操作系统返回的内存分配结果。

进一步地,所述向操作系统申请指定大小的内存作为预留内存,包括:向操作系统 申请指定大小的内存作为预留内存,将所述预留内存分配给指定预留内存持有者;

所述将所述预留内存归还给操作系统,包括:通知预留内存持有者释放所述预留 内存。

本发明还提供了一种内存管理系统,包括:

预留内存申请模块,用于向操作系统申请指定大小的内存作为预留内存;

目标覆盖函数设置模块,用于设置目标覆盖函数;

请求截获模块,用于通过目标覆盖函数截获各内存分配器向操作系统申请内存的 请求,并将截获的请求发送给操作系统;响应监控模块,用于通过目标覆盖函数监控操作系 统对所述请求的响应结果;

判断模块,用于根据响应结果判断向操作系统申请内存是否成功;

预留内存归还模块,用于将所述预留内存归还给操作系统;

内存申请模块,用于通过目标覆盖函数重新向操作系统发送申请内存的请求。

进一步地,还包括:

回收通知模块,用于通知各内存分配器对应的内存控制模块回收内存。

进一步地,还包括:

二次预留模块,用于再次向操作系统申请指定大小的内存作为预留内存。

进一步地,还包括:

结果接收模块,用于通过目标覆盖函数接收操作系统返回的内存分配结果。

进一步地,所述预留内存申请模块包括预留内存分配单元,用于将所述预留内存 分配给指定预留内存持有者。

进一步地,所述预留内存使用模块包括释放通知单元,用于通知预留内存持有者 释放所述预留内存。

进一步地,还包括内存分配器,用于响应程序申请内存的请求,若响应失败,则向 操作系统发送申请内存的请求。

进一步地,所述内存分配器包括:

程序请求接收单元,用于接收程序申请内存的请求;

响应单元,用于使用内存分配器内部缓存的空余内存响应所述请求。

本发明实施例提供了一种内存管理方法,该方法包括

向操作系统申请指定大小的内存作为预留内存;设置目标覆盖函数;通过目标覆 盖函数截获各内存分配器向操作系统申请内存的请求,并将截获的请求发送给操作系统; 通过目标覆盖函数监控操作系统对所述请求的响应结果;根据响应结果判断向操作系统申 请内存是否成功;若否,则将所述预留内存归还给操作系统;通过目标覆盖函数重新向操作 系统发送申请内存的请求。本发明覆盖了各内存分配器向系统申请内存的过程,引入预留 内存以解决内存分配器向操作系统申请内存失败报内存不足错误OOM的问题,本发明能够 截获个内存分配前与向系统申请内存的请求及系统向内存分配器返回的分配结果,从而获 取各内存分配器与系统的交互信息,并在截获到申请失败时通过归还预留内存有效地缓解 内存不足问题,从而在很大程度上减少了内存不足错误的发生频率。

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

图1是根据现有相关技术中的内存管理方法的示意图;

图2是根据本发明实施例的内存管理方法的计算机终端的硬件结构框图;

图3是根据本发明实施例1的内存管理方法的流程图;

图4是根据本发明实施例1中内存分配器工作的流程图;

图5是根据本发明实施例2的内存管理方法的又一流程图;

图6是根据本发明实施例3的内存管理系统的流程图;

图7是根据本发明实施例的计算机终端的结构框图。

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的 附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是 本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人 员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范 围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第 二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用 的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或 描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆 盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于 清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品 或设备固有的其它步骤或单元。

实施例1

根据本发明实施例,提供了一种内存管理方法的实施例,需要说明的是,在附图的 流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在 流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描 述的步骤。

本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运 算装置中执行。以运行在计算机终端上为例,图2是根据本发明实施例的内存管理方法的计 算机终端的硬件结构框图。如图2所示,计算机终端100可以包括一个或多个(图中仅示出一 个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理 装置)、用于存储数据的存储器104、以及用于通信功能的传输装置106。本领域普通技术人 员可以理解,图2所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算 机终端100还可包括比图2中所示更多或者更少的组件,或者具有与图2所示不同的配置。

存储器104可用于存储应用软件的软件程序以及模块,如本发明实施例中的内存 管理方法对应的程序指令/模块,处理器102通过运行存储在存储器104内的软件程序以及 模块,从而执行各种功能应用以及数据处理,即实现上述的内存管理方法。存储器104可包 括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者 其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程 设置的存储器,这些远程存储器可以通过网络连接至计算机终端10。上述网络的实例包括 但不限于互联网、企业内部网、局域网、移动通信网及其组合。

传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括 计算机终端100的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络 适配器(Network Interface Controller,简称为NIC),其可通过与其他网络设备相连 从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,简 称为RF)模块,其用于通过无线方式与互联网进行通讯。

在上述运行环境下,本申请提供了如图3所示的内存管理方法。该方法可以应用于 具有内存分配器和操作系统的处理器中,操作系统可以是例如iOS系统。内存分配器用于向 操作系统申请大块内存空间并进行管理,响应用户内存请求。

如图3所示,该内存管理方法的一种可选的方案包括如下步骤:

步骤S301、向操作系统申请指定大小的内存作为预留内存。

一般来说,应用程序向操作系统申请的内存为虚拟内存,在32位系统上,虚拟内存 的可用空间为0-3G。向操作系统申请的预留内存的大小可以为200M-500M。由于设置预留内 存,在各内存分配器响应程序发送的内存请求失败时,可以将预留内存释放给内存分配器。 但是,预留内存若过大,则会造成内存大量空置,若太小,又无法满足内存分配器的内存需 求,因此,设置预留内存大小为200M-500M,能够在满足内存分配器的需求的同时,不会影响 操作系统正常运行。

作为一种可选的实施方式,本申请向操作系统申请指定大小的内存作为预留内 存,将所述预留内存分配给指定预留内存持有者。

步骤S302、设置目标覆盖函数。

步骤S303、通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,将 截获的请求发送给操作系统。

在本申请的步骤S303中,对于较大的应用程序,由于存在多种模块,需要多个内存 分配器。各内存分配器分别响应程序发送的申请内存的请求,在响应失败时,才向操作系统 发送申请内存的请求。各内存分配器响应程序申请内存的请求,若响应失败,则向操作系统 发送申请内存的请求。具体来说,如图4所示,内存分配器工作过程如下:

S401、各内存分配器接收程序申请内存的请求。

S402、内存分配器使用内部缓存的空余内存响应所述请求。

S403、判断响应是否成功。若成功,则执行步骤S404,若失败,则执行步骤S405。

S404、根据所述请求向程序分配内存。

S405、向操作系统发送申请内存的请求。

步骤S304、通过目标覆盖函数监控操作系统对所述请求的响应结果。

其中,通过目标覆盖函数监控操作系统对所述请求的响应结果是指通过目标覆盖 函数接收系统返回的内存分配结果。

步骤S305、根据响应结果判断向操作系统申请内存是否成功。若否,则执行步骤 S306。若是,则执行步骤S308。

步骤S306,将所述预留内存归还给操作系统。

步骤S307,通过目标覆盖函数重新向操作系统发送申请内存的请求。

步骤S308,向内存分配器返回内存分配结果。也就是说,将所述内存分配结果返回 给向操作系统申请内存对应的内存分配器。

内存分配器接到返回的内存分配结果后,根据结果进行内存分配。

在本申请中,向操作系统申请内存成功时,操作系统会返回具体的内存分配数据; 向操作系统申请内存失败时,操作系统会返回一个NULL值。根据操作系统的返回值,就能判 断向操作系统申请内存是否成功。

作为一种可选的实施方式,步骤S306中将所述预留内存归还给操作系统,包括:通 知预留内存持有者释放所述预留内存。

预留内存得到释放后,系统可对该部分内存重新分配。

本发明实施例提供了一种内存管理方法,该方法包括向操作系统申请指定大小的 内存作为预留内存;设置目标覆盖函数;通过目标覆盖函数截获各内存分配器向操作系统 申请内存的请求,并将截获的请求发送给操作系统;通过目标覆盖函数监控操作系统对所 述请求的响应结果;根据响应结果判断向操作系统申请内存是否成功;若否,则将所述预留 内存归还给操作系统;通过目标覆盖函数重新向操作系统发送申请内存的请求。本发明覆 盖了各内存分配器向系统申请内存的过程,引入预留内存以解决内存分配器向操作系统申 请内存失败报内存不足错误OOM的问题,本发明能够截获个内存分配前与向系统申请内存 的请求及系统向内存分配器返回的分配结果,从而获取各内存分配器与系统的交互信息, 并在截获到申请失败时通过归还预留内存有效地缓解内存不足问题,从而在很大程度上减 少了内存不足错误的发生频率。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列 的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为 依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知 悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明 所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施 例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多 情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有 技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储 介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算 机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

实施例2

如图5所示,本发明提供了另一种内存管理方法,包括:

步骤S501、向操作系统申请指定大小的内存作为预留内存。

步骤S502、设置目标覆盖函数。

步骤S503、通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并 将截获的请求发送给操作系统。

步骤S504、通过目标覆盖函数监控操作系统对所述请求的响应结果。

步骤S505、根据响应结果判断向操作系统申请内存是否成功。若向操作系统申请 内存失败,执行步骤S506,若成功,执行步骤S508。

步骤S506、将所述预留内存归还给操作系统。

步骤S507、重新向操作系统发送申请内存的请求。

步骤S508、向内存分配器返回内存分配结果。也就是,通过目标覆盖函数将所述内 存分配结果返回给向操作系统申请内存对应的内存分配器。

作为可选的实施例,步骤S508后还包括:

步骤S509、通过目标覆盖函数通知各内存分配器对应的内存控制模块回收内存。

其中,每个内存分配器中都设置有内存控制模块,内存控制模块可以发送回收内 存的指令。这样一来,能够保证可使用的内存保持在可接受范围内,从而从机制上预防OOM 错误的发送,避免内存不足。

本申请的步骤S509中,通知各内存分配器对应的内存控制模块回收内存具体可以 包括向内存控制模块发送内存不足的指令的步骤。

作为可选的实施例,步骤S507后还包括:

步骤S510、再次向操作系统申请指定大小的内存作为预留内存。

再次申请预留内存,能够预防下一次内存分配器发送内存不足错误。

作为可选的实施例,步骤S507后还包括:

步骤S511、通过目标覆盖函数截获操作系统向内存分配器发送的内存分配结果。

步骤S512、判断向操作系统申请内存是否成功。

若成功,则执行步骤S508。若失败,执行步骤S513。

步骤S513、报告内存不足错误。

目标覆盖函数用于实现将内存分配器向操作系统申请内存改为内存分配器调用 目标覆盖函数向操作系统申请内存。当然,该目标覆盖函数还用于实现将操作系统向内存 分配器返回结果改为操作系统向目标覆盖函数返回结果。目标覆盖函数再对该返回结果进 行处理。

本申请通过设置目标覆盖函数来实现截获各内存分配器与系统交互的数据,并根 据截获的所述数据,在内存分配器向操作系统请求内存失败时,释放预留内存,使操作系统 能够将释放的预留内存分配给请求失败的内存分配器,减少或避免内存分配器发生内存不 足错误。本申请能够通过目标覆盖函数监控各内存分配器的内存使用情况,通过预留内存 的使用来避免内存分配器的OOM错误。

其中,对于如何设置目标覆盖函数,本申请提供了三种方式。以下就第一种实现方 式进行详细说明:

将内存分配器向操作系统申请内存改为调用目标覆盖函数向操作系统申请内存。

具体来说,将内存分配器中向操作系统申请内存的函数改名重定向到目标覆盖内 存分配函数,目标覆盖函数可以直接调用系统内存分配函数。

其中,系统内存分配函数为操作系统中,用于分配系统内存的函数。

举例来说,设内存分配器中的共享库为malloc.so,内存分配器中向操作系统申请 内存的函数为malloc;操作系统的共享库为libc.so,系统内存分配函数为mmap。目标覆盖 函数为m_mmap。

现有技术中,在malloc.so中,malloc直接调用mmap,若申请内存失败,则直接报错 OOM。

本申请中,在malloc.so中,malloc改为调用目标覆盖函数m_mmap,目标覆盖函数 m_mmap调用libc.so中的系统内存分配函数mmap。

以下就第二种设置目标覆盖函数的方式进行详细说明:

建立包含所述目标覆盖函数的目标覆盖函数共享库,将所述目标覆盖函数命名为 和操作系统中的系统内存分配函数一致;所述系统内存分配函数用于响应申请内存的请 求;

先加载所述目标覆盖函数共享库;

再加载所述系统内存分配函数所在的共享库。

举例来说,设内存分配器中的共享库为malloc.so,内存分配器中向操作系统申请 内存的函数为malloc;操作系统的共享库为libc.so,系统内存分配函数为mmap。

首先建立目标覆盖函数共享库mmap.so,mmap.so中包含目标覆盖函数mmap.so,该 函数的函数名称与系统内存分配函数一致,但位于目标覆盖函数共享库中,功能和位置均 与系统内存分配函数不同。

设定先加载所述目标覆盖函数共享库mmap.so;

再加载所述系统内存分配函数所在的共享库libc.so。

由于先加载所述目标覆盖函数共享库mmap.so,对于malloc.so:

malloc先调用包含在mmap.so中的目标覆盖函数mmap;

对于mmap.so:

包含在目标覆盖函数共享库mmap.so中的目标覆盖函数mmap调用包含在libc.so 中的系统内存分配函数mmap。

由于第二种设置目标覆盖函数的方式可能在一些操作系统内核中(如低版本 linux)不能正常运行,因此本申请提供了第三种设置目标覆盖函数的方式:

以下就第三种设置目标覆盖函数的方式进行详细说明:

建立包含中间函数的中间函数共享库,所述中间函数共享库与各内存分配器所在 的共享库静态连接;

将所述目标覆盖函数命名为和操作系统中的系统内存分配函数一致,所述目标覆 盖函数通过调用所述中间函数来调用所述系统内存分配函数;所述系统内存分配函数用于 响应申请内存的请求。

举例来说,设内存分配器中的共享库为malloc.so,内存分配器中向操作系统申请 内存的函数为malloc;操作系统的共享库为libc.so,系统内存分配函数为mmap。

建立包含中间函数my_mmap的中间函数共享库mmap.so。在malloc.so中建立目标 覆盖函数mmap。

对于malloc.so:

malloc先调用包含在中间函数共享库mmap.so中的目标覆盖函数mmap;目标覆盖 函数mmap再调用中间函数my_mmap。

对于mmap.so:

包含在中间函数共享库mmap.so中的中间函数my_mmap调用包含在libc.so中的系 统内存分配函数mmap。

以上提供了三种设置目标覆盖函数的方式,这三种方式具有不同的使用场景,值 得注意的是,本申请并不局限于上述三种方式,还有其他实现目标覆盖函数功能的函数或 功能模块设置均适用于本申请。

本发明在截获到内存分配器向系统申请内存失败时,向各分配器所在的内存控制 模块发出内存不足消息,通知各模块回收整理内存,使得应用可使用内存保持在可接受范 围内,从而提高用户可感知的应用稳定性、性能和流畅度指标。

实施例3

如图6所示,本发明还提供了一种内存管理系统,包括:

预留内存申请模块601,用于向操作系统申请指定大小的内存作为预留内存;

目标覆盖函数设置模块602,用于设置目标覆盖函数;

请求截获模块603,用于通过目标覆盖函数截获各内存分配器向操作系统申请内 存的请求,并将截获的请求发送给操作系统;响应监控模块,用于通过目标覆盖函数监控操 作系统对所述请求的响应结果;

判断模块604,用于根据响应结果判断向操作系统申请内存是否成功;

预留内存归还模块605,用于将所述预留内存归还给操作系统;

内存申请模块606,用于通过目标覆盖函数重新向操作系统发送申请内存的请求。

作为一种可选的实施方式,还包括:

回收通知模块607,用于通知各内存分配器对应的内存控制模块回收内存。

作为一种可选的实施方式,还包括:

二次预留模块608,用于再次向操作系统申请指定大小的内存作为预留内存。

作为一种可选的实施方式,还包括:

结果接收模块609,用于接收操作系统返回的内存分配结果。

作为一种可选的实施方式,还包括:

所述预留内存申请模块601包括预留内存分配单元6011,用于将所述预留内存分 配给指定预留内存持有者。

作为一种可选的实施方式,所述预留内存归还模块605包括释放通知单元6051,用 于通知预留内存持有者释放所述预留内存。

作为一种可选的实施方式,还包括内存分配器610,用于响应程序申请内存的请 求,若响应失败,则向操作系统发送申请内存的请求。

作为一种可选的实施方式,所述内存分配器610包括:

程序请求接收单元6021,用于接收程序申请内存的请求;

响应单元6022,用于使用内存分配器内部缓存的空余内存响应所述请求。

本发明实施例提供了一种内存管理系统,包括预留内存申请模块,用于向操作系 统申请指定大小的内存作为预留内存;目标覆盖函数设置模块,用于设置目标覆盖函数;请 求截获模块,用于通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并将 截获的请求发送给操作系统;响应监控模块,用于通过目标覆盖函数监控操作系统对所述 请求的响应结果;判断模块,用于根据响应结果判断向操作系统申请内存是否成功;预留内 存归还模块,用于将所述预留内存归还给操作系统;内存申请模块,用于通过目标覆盖函数 重新向操作系统发送申请内存的请求。本发明覆盖了各内存分配器向系统申请内存的过 程,引入预留内存以解决内存分配器向操作系统申请内存失败报内存不足错误OOM的问题, 本发明能够截获个内存分配前与向系统申请内存的请求及系统向内存分配器返回的分配 结果,从而获取各内存分配器与系统的交互信息,并在截获到申请失败时通过归还预留内 存有效地缓解内存不足问题,从而在很大程度上减少了内存不足错误的发生频率。

实施例4

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可 以用于保存上述实施例一种内存管理方法所执行的程序代码。

可选地,在本实施例中,上述存储介质可以位于计算机网络的多个网络设备中的 至少一个网络设备。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:

第一步,向操作系统申请指定大小的内存作为预留内存。

第二步,设置目标覆盖函数。

第三步,通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并将 截获的请求发送给操作系统。

第四步,通过目标覆盖函数监控操作系统对所述请求的响应结果。

第五步,根据响应结果判断向操作系统申请内存是否成功。

第六步,在申请失败时,将所述预留内存归还给操作系统。

第七步,通过目标覆盖函数重新向操作系统发送申请内存的请求。

可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM, Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者 光盘等各种可以存储程序代码的介质。

实施例5

本发明的实施例还提供一种计算机终端,该计算机终端可以是计算机终端中的 任意一个计算机终端设备。可选地,在本实施例中,上述计算机终端也可以替换为移动终端 等终端设备。

可选地,在本实施例中,上述计算机终端可以位于计算机网络的多个网络设备中 的至少一个网络设备。

可选地,图7是根据本发明实施例的计算机终端的结构框图。如图7所示,该计算机 终端A可以包括:一个或多个(图中仅示出一个)处理器71、存储器73、以及传输装置75。

其中,存储器73可用于存储软件程序以及模块,如本发明实施例中的内存管理的 方法和装置对应的程序指令/模块,处理器71通过运行存储在存储器73内的软件程序以及 模块,从而执行各种功能应用以及数据处理,即实现上述的内存管理。存储器73可包括高速 随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他 非易失性固态存储器。在一些实例中,存储器73可进一步包括相对于处理器71远程设置的 存储器,这些远程存储器可以通过网络连接至计算机终端A。上述网络的实例包括但不限于 互联网、企业内部网、局域网、移动通信网及其组合。

上述的传输装置75用于经由一个网络接收或者发送数据。上述的网络具体实例可 包括有线网络及无线网络。在一个实例中,传输装置75包括一个网络适配器,其可通过网线 与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装 置75为射频模块,其用于通过无线方式与互联网进行通讯。

其中,具体地,存储器73用于存储预设动作条件和预设权限用户的信息、以及应用 程序。

处理器71可以通过传输装置调用存储器73存储的信息及应用程序,以执行下述步 骤:

可选的,上述处理器71还可以执行如下步骤的程序代码:

第一步,向操作系统申请指定大小的内存作为预留内存。

第二步,各内存分配器响应程序申请内存的请求,若响应失败,则向操作系统发送 申请内存的请求。

第三步,截获各内存分配器向操作系统申请内存的请求,将截获的请求发送给操 作系统。

第四步,若向操作系统申请内存失败,则将所述预留内存归还给操作系统,重新向 操作系统发送申请内存的请求。

可选的,上述处理器71还可以执行如下步骤的程序代码:

第一步,向操作系统申请指定大小的内存作为预留内存。

第二步,设置目标覆盖函数。

第三步,通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并将 截获的请求发送给操作系统。

第四步,通过目标覆盖函数监控操作系统对所述请求的响应结果。

第五步,根据响应结果判断向操作系统申请内存是否成功。

第六步,在申请失败时,将所述预留内存归还给操作系统。

第七步,通过目标覆盖函数重新向操作系统发送申请内存的请求。

可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示 例,本实施例在此不再赘述。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品 销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技 术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软 件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一 台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所 述方法的全部或部分步骤。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有 详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方 式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一 种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者 可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之 间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连 接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显 示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个 网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目 的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以 是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单 元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人 员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应 视为本发明的保护范围。

本文发布于:2023-04-13 15:22:44,感谢您对本站的认可!

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

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

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