CN108062247A - 一种内存管理方法及系统 - Google Patents

一种内存管理方法及系统 Download PDF

Info

Publication number
CN108062247A
CN108062247A CN201610987681.4A CN201610987681A CN108062247A CN 108062247 A CN108062247 A CN 108062247A CN 201610987681 A CN201610987681 A CN 201610987681A CN 108062247 A CN108062247 A CN 108062247A
Authority
CN
China
Prior art keywords
memory
operating system
target coverage
function
application
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
Application number
CN201610987681.4A
Other languages
English (en)
Other versions
CN108062247B (zh
Inventor
刘海鹏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Yayue Technology Co ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201610987681.4A priority Critical patent/CN108062247B/zh
Publication of CN108062247A publication Critical patent/CN108062247A/zh
Application granted granted Critical
Publication of CN108062247B publication Critical patent/CN108062247B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation 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/5016Allocation 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Hardware Redundancy (AREA)

Abstract

本发明公开了一种内存管理方法及系统,属于互联网技术领域。方法包括:向操作系统申请指定大小的内存作为预留内存;设置目标覆盖函数;通过目标覆盖函数截获各内存分配器向操作系统申请内存的请求,并将截获的请求发送给操作系统;通过目标覆盖函数监控操作系统对请求的响应结果;根据响应结果判断向操作系统申请内存是否成功;若否,则将预留内存归还给操作系统;通过目标覆盖函数重新向操作系统发送申请内存的请求。本发明覆盖了各内存分配器向系统申请内存的过程,引入预留内存以解决内存分配器向操作系统申请内存失败报内存不足错误OOM的问题,从而在很大程度上减少了内存不足错误的发生频率。

Description

一种内存管理方法及系统
技术领域
本发明涉及互联网技术领域,尤其涉及一种内存管理方法及系统。
背景技术
以浏览器应用为代表的复杂应用,一般由多个模块组成,这些模块可能采用不同的内存管理方式,使用不同的内存分配器,相互之间没有更多的了解,彼此向系统申请内存也是缺乏协调的。这容易导致进程虚存空间的碎片及内存空间内存不足错误,或称OOM(OutOf 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中所描述的示例,本实施例在此不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (14)

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所述的内存管理系统,其特征在于,所述预留内存归还模块包括释放通知单元,用于通知预留内存持有者释放所述预留内存。
CN201610987681.4A 2016-11-09 2016-11-09 一种内存管理方法及系统 Active CN108062247B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610987681.4A CN108062247B (zh) 2016-11-09 2016-11-09 一种内存管理方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610987681.4A CN108062247B (zh) 2016-11-09 2016-11-09 一种内存管理方法及系统

Publications (2)

Publication Number Publication Date
CN108062247A true CN108062247A (zh) 2018-05-22
CN108062247B CN108062247B (zh) 2021-09-14

Family

ID=62137544

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610987681.4A Active CN108062247B (zh) 2016-11-09 2016-11-09 一种内存管理方法及系统

Country Status (1)

Country Link
CN (1) CN108062247B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109753361A (zh) * 2019-01-04 2019-05-14 合肥杰发科技有限公司 一种内存管理方法、电子设备及存储装置
CN109753363A (zh) * 2019-01-31 2019-05-14 深兰科技(上海)有限公司 一种嵌入式系统内存管理方法及装置
CN112114962A (zh) * 2020-09-04 2020-12-22 北京达佳互联信息技术有限公司 一种内存分配方法及装置
CN113407309A (zh) * 2021-06-28 2021-09-17 北京字节跳动网络技术有限公司 虚拟机内存申请方法、装置、存储介质及电子设备

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040230762A1 (en) * 2003-05-15 2004-11-18 International Business Machines Corporation Methods, systems, and media for managing dynamic storage
CN102156675A (zh) * 2010-02-12 2011-08-17 中兴通讯股份有限公司 一种内存分配方法及装置
CN102455974A (zh) * 2010-10-21 2012-05-16 上海宝信软件股份有限公司 一种内存消耗可控的高速内存申请释放管理系统及方法
CN102915276A (zh) * 2012-09-25 2013-02-06 武汉邮电科学研究院 一种用于嵌入式系统的内存控制方法
CN103488576A (zh) * 2013-09-18 2014-01-01 珠海金山网络游戏科技有限公司 一种高性能小区块内存管理方法
CN104102590A (zh) * 2014-07-22 2014-10-15 浪潮(北京)电子信息产业有限公司 一种异构内存管理方法及装置
CN105302738A (zh) * 2015-12-09 2016-02-03 北京东土科技股份有限公司 一种内存分配方法及装置

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040230762A1 (en) * 2003-05-15 2004-11-18 International Business Machines Corporation Methods, systems, and media for managing dynamic storage
CN102156675A (zh) * 2010-02-12 2011-08-17 中兴通讯股份有限公司 一种内存分配方法及装置
CN102455974A (zh) * 2010-10-21 2012-05-16 上海宝信软件股份有限公司 一种内存消耗可控的高速内存申请释放管理系统及方法
CN102915276A (zh) * 2012-09-25 2013-02-06 武汉邮电科学研究院 一种用于嵌入式系统的内存控制方法
CN103488576A (zh) * 2013-09-18 2014-01-01 珠海金山网络游戏科技有限公司 一种高性能小区块内存管理方法
CN104102590A (zh) * 2014-07-22 2014-10-15 浪潮(北京)电子信息产业有限公司 一种异构内存管理方法及装置
CN105302738A (zh) * 2015-12-09 2016-02-03 北京东土科技股份有限公司 一种内存分配方法及装置

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109753361A (zh) * 2019-01-04 2019-05-14 合肥杰发科技有限公司 一种内存管理方法、电子设备及存储装置
CN109753361B (zh) * 2019-01-04 2020-10-23 合肥杰发科技有限公司 一种内存管理方法、电子设备及存储装置
CN109753363A (zh) * 2019-01-31 2019-05-14 深兰科技(上海)有限公司 一种嵌入式系统内存管理方法及装置
CN109753363B (zh) * 2019-01-31 2021-06-29 深兰科技(上海)有限公司 一种嵌入式系统内存管理方法及装置
CN112114962A (zh) * 2020-09-04 2020-12-22 北京达佳互联信息技术有限公司 一种内存分配方法及装置
CN113407309A (zh) * 2021-06-28 2021-09-17 北京字节跳动网络技术有限公司 虚拟机内存申请方法、装置、存储介质及电子设备

Also Published As

Publication number Publication date
CN108062247B (zh) 2021-09-14

Similar Documents

Publication Publication Date Title
CN108062247A (zh) 一种内存管理方法及系统
CN110389843B (zh) 一种业务调度方法、装置、设备及可读存储介质
CN109167702A (zh) 一种基于负载均衡的分布式测试方法及装置
EP3745678B1 (en) Storage system, and method and apparatus for allocating storage resources
CN106101171B (zh) 服务器连接方法及装置
CN108287751A (zh) 任务执行方法及装置、分布式系统
CN103229535A (zh) 电信网络中用于单元恢复的方法和系统
CN111880936A (zh) 资源调度方法、装置、容器集群、计算机设备和存储介质
CN109656572A (zh) 安装包的打包方法及装置、计算机设备、存储介质
CN109792393A (zh) 虚拟化离线计费系统中的软件升级
WO2013074537A2 (en) Selective ip address allocation for probes that do not have assigned ip addresses
CN108709290A (zh) 空调系统的组网方法和装置、存储介质和处理器
CN110224897A (zh) 应用程序的弱网络测试方法、装置、移动设备及存储介质
CN112698838A (zh) 多云容器部署系统及其容器部署方法
CN112134964A (zh) 控制器分配方法、计算机设备、存储介质及网络业务系统
CN113709707B (zh) 服务网格中边车部署的方法、装置、电子设备和存储介质
CN109688631A (zh) 一种连接处理方法和设备
KR20180094369A (ko) 네트워크 장치 및 그의 인터럽트 관리 방법
CN108540408B (zh) 一种基于Openstack的分布式虚拟交换机的管理方法及系统
CN105656794B (zh) 数据分发方法、装置及计算机可读存储介质
CN109445969A (zh) 一种分布式tgt节点间的通信方法、装置及设备
CN109151868B (zh) 一种小区激活方法及相关设备
CN109343944A (zh) eSIM卡的数据处理方法、装置、终端及存储介质
CN104657240B (zh) 多内核操作系统的失效控制方法及装置
CN105450679A (zh) 进行数据云存储的方法及系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20221116

Address after: 1402, Floor 14, Block A, Haina Baichuan Headquarters Building, No. 6, Baoxing Road, Haibin Community, Xin'an Street, Bao'an District, Shenzhen, Guangdong 518100

Patentee after: Shenzhen Yayue Technology Co.,Ltd.

Address before: 518000 Room 403, East Building 2, SEG Science Park, Zhenxing Road, Futian District, Shenzhen, Guangdong

Patentee before: TENCENT TECHNOLOGY (SHENZHEN) Co.,Ltd.