CN112650692A - 堆内存分配方法、装置及存储介质 - Google Patents
堆内存分配方法、装置及存储介质 Download PDFInfo
- Publication number
- CN112650692A CN112650692A CN201910967329.8A CN201910967329A CN112650692A CN 112650692 A CN112650692 A CN 112650692A CN 201910967329 A CN201910967329 A CN 201910967329A CN 112650692 A CN112650692 A CN 112650692A
- Authority
- CN
- China
- Prior art keywords
- memory
- size
- application program
- application
- heap
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/14—Protection against unauthorised use of memory or access to memory
- G06F12/1416—Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
- G06F12/0646—Configuration or reconfiguration
Abstract
本申请公开了一种堆内存分配方法、装置及存储介质,属于数据处理领域。在本申请中,可以获取当前申请堆内存的应用程序对应的文件名、行号和内存申请大小,之后,从越界记录文件中查找目标记录。其中,越界记录文件包括多条记录,每条记录包括文件名、行号和越界次数,目标记录是指多条记录中包括的文件名和行号分别与应用程序对应的文件名和行号相同的记录。如果查找到目标记录,则根据目标记录包括的越界次数,确定理论内存扩充大小,并根据内存申请大小和理论内存扩充大小,向应用程序分配堆内存。由此可见,本申请提供的方法考虑了历史越界情况,按照历史越界情况向应用程序分配堆内存之后,可以减少堆内存写越界发生的次数。
Description
技术领域
本申请涉及数据处理领域,特别涉及一种堆内存分配方法、装置及存储介质。
背景技术
堆内存是指应用程序在运行的过程中动态地向操作系统申请的内存。也即是,在应用程序运行的过程中,操作系统可以基于应用程序的申请向应用程序分配堆内存。其中,应用程序在运行的过程中,可能会多次向操作系统申请堆内存,且每次申请的堆内存的内存大小可能相同,也可能不同。
目前,应用程序在运行的过程中可能会出现逻辑错误的情况,在这种情况下,写入堆内存的数据需要的内存大小可能会大于应用程序申请的堆内存的内存大小,这样,写入堆内存的数据会占用其他堆内存的内存空间,导致其他堆内存的数据被改写,从而发生堆内存写越界。并且,在引起堆内存写越界的原因不变的情况下,堆内存写越界会重复发生。
对于这种情况,当操作系统向应用程序分配堆内存时,会在堆内存的末地址写入一个指定魔术字。之后,操作系统可以检测堆内存的末地址写入的数据,当堆内存的末地址写入的数据为指定魔术字时,确定没有发生堆内存写越界。当堆内存的末地址写入的数据不为指定魔术字时,确定当前已发生堆内存写越界,此时,操作系统可以发出堆内存写越界警告。
但是上述写入指定魔术字的方法在检测到已发生堆内存写越界时,只进行堆内存写越界警告,无法减少堆内存写越界发生的次数。
发明内容
本申请提供了一种堆内存分配方法、装置及存储介质,可以解决一旦发生堆内存写越界就会多次发生的问题。所述技术方案如下:
第一方面,提供了一种堆内存分配方法,所述方法包括:
获取当前申请堆内存的应用程序对应的文件名、行号和内存申请大小,所述文件名是指所述应用程序的源代码文件的名称,所述行号是指所述源代码文件中用于申请堆内存的代码所在行的编号,所述内存申请大小是指所述应用程序当前申请的堆内存的大小;
从越界记录文件中查找目标记录,其中,所述越界记录文件包括多条记录,每条记录包括文件名、行号和越界次数,所述目标记录是指所述多条记录中包括的文件名和行号分别与所述应用程序对应的文件名和行号相同的记录;
如果查找到所述目标记录,则根据所述目标记录包括的越界次数,确定理论内存扩充大小;
根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存。
在本申请中,当有应用程序申请堆内存时,可以在越界记录文件中查找目标记录,其中,目标记录包括文件名、行号和越界次数。由于目标记录的文件名和行号分别与应用程序对应的文件名和行号相同,因此,可以根据目标记录中的越界次数,确定理论内存扩充大小,进而按照应用程序申请的堆内存的大小和理论内存扩充大小,向应用程序分配堆内存。也即是,本申请提供的方法考虑了历史越界情况,按照历史越界情况向应用程序分配堆内存之后,可以减少堆内存写越界发生的次数。
可选地,所述根据所述目标记录包括的越界次数,确定理论内存扩充大小,包括:
将所述目标记录包括的越界次数与单次扩充大小之间的乘积,确定为所述理论内存扩充大小。
其中,单次扩充大小是一个可以根据经验预先设置的扩充大小。
在另一种可能的实现方式中,越界记录文件的每条记录中还包括每一次越界的越界大小。操作系统可以获取目标记录中包括的越界次数和每一次越界的越界大小,将每一次越界的越界大小进行求和,再除以越界次数,得到平均越界大小,将该平均越界大小确定为理论内存扩充大小。
需要说明的是,操作系统不仅可以通过上述两种方式来确定理论内存扩充大小,还可以通过其他的方式来确定理论内存扩充大小,本申请实施例不再一一列举。
可选地,所述根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存,包括:
如果所述理论内存扩充大小没有超过内存扩充门限,则将所述理论内存扩充大小作为实际内存扩充大小,根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存。
需要说明的是,操作系统中存储有一个预先设置好的内存扩充门限,该内存扩充门限用于指示可以向应用程序分配的最大扩充内存。由于理论内存扩充大小没有超过内存扩充门限,因此,可以将理论内存扩充大小作为实际内存扩充大小。
操作系统将理论内存扩充大小作为实际内存扩充大小后,可以计算应用程序的内存申请大小与实际内存扩充大小之和,得到第一内存大小,将第一内存大小作为应该分配给应用程序的堆内存的大小。之后,操作系统可以根据第一内存大小,向应用程序分配堆内存。
可选地,所述根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存,包括:
如果所述理论内存扩充大小超过内存扩充门限,则将所述内存扩充门限作为实际内存扩充大小,根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存。
操作系统将内存扩充门限作为应用程序的实际内存扩充大小后,可以计算应用程序的内存申请大小与实际内存扩充大小之和,得到第二内存大小。将第二内存大小作为应该分配给应用程序的堆内存的大小。之后,操作系统可以根据第二内存大小,向应用程序分配堆内存。
需要说明的是,如果理论内存扩充大小超过内存扩充门限,那么操作系统将理论内存扩充大小作为实际内存扩充大小的话,分配给应用程序堆内存可能会占用过大的内存空间,影响操作系统的正常运行。因此,在理论内存扩充大小超过内存扩充门限时,可以将内存扩充门限作为实际内存扩充大小。也即是,限定一个最大的实际内存扩充大小,从而可以避免操作系统向应用程序分配过大的堆内存,导致操作系统不能正常运行。
在本申请实施例中,当操作系统每向应用程序分配一个包含扩充内存的堆内存或释放一个包含扩充内存的堆内存时,需要对内存扩充门限进行更新。具体的,每向应用程序分配一个包含扩充内存的堆内存时,可以将减去已分配堆内存的实际内存扩充大小的内存扩充门限作为更新后的内存扩充门限,同样的,当释放一个包含扩充内存的堆内存时,可以将该释放的堆内存的实际内存扩充大小与内存扩充门限之和作为更新后的内存扩充门限。
可选地,所述应用程序的堆内存的内存头包括扩充大小字段;
所述根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存之后,还包括:
将所述实际内存扩充大小写入所述扩充大小字段中。
在本申请实施例中,堆内存的结构可以包括内存头、数据和指定数据这三个部分。内存头部分包括文件名、行号、申请大小、扩充大小、申请链指针和释放链指针这六个字段,且每个字段的长度是固定的,也即是,内存头的长度是固定的。
操作系统根据内存申请大小和实际内存扩充大小,向应用程序分配堆内存之后,可以将应用程序的源代码文件的名称写入文件名字段中,将源代码文件中用于申请堆内存的代码所在行的编号写入行号字段中,将内存申请大小写入申请大小字段中,将实际内存扩充大小写入扩充大小字段中。
可选地,所述从越界记录文件中查找目标记录之后,还包括:
如果未查找到所述目标记录,则根据所述内存申请大小,向所述应用程序分配堆内存。
在一些实施例中,操作系统在越界记录文件中也可能未查找到目标记录。此时,操作系统可以根据内存申请大小,向应用程序分配堆内存。也即是,在这种情况下,操作系统不会对应用程序申请的堆内存大小进行扩充,而是直接将应用程序的内存申请大小作为分配给应用程序的堆内存的大小,进而向应用程序分配堆内存。在这种情况下,内存头中的扩充大小中写入的实际内存扩充大小为0。
可选地,所述根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存之后,还包括:
根据当前分配给所述应用程序的堆内存的内存头,获取当前分配给所述应用程序的堆内存的末地址写入的数据;
如果当前分配给所述应用程序的堆内存的末地址写入的数据不为指定数据,则确定当前已发生堆内存写越界,根据所述应用程序对应的文件名和行号,对所述目标记录包括的越界次数进行更新。
为了减少后续分配的堆内存发生写越界的次数,操作系统在向应用程序分配堆内存时,会在堆内存的末地址中写入一个指定数据,该指定数据用于标识该指定数据所在的地址为堆内存的末地址。之后,操作系统可以根据堆内存的末地址写入的数据,检测堆内存是否发生堆内存写越界,并对越界记录文件进行更新。
在一些实施例中,操作系统可以根据当前分配给应用程序的堆内存的内存头,获取当前分配给应用程序的堆内存的末地址写入的数据。如果当前分配给应用程序的堆内存的末地址写入的数据不为指定数据,则确定当前已发生堆内存写越界,根据应用程序对应的文件名和行号,对目标记录包括的越界次数进行更新。如果当前分配给应用程序的堆内存的末地址写入的数据为指定数据,则确定当前未发生堆内存写越界。
由于本申请实施例在分配堆内存时,向堆内存的末地址写入指定数据,则可以通过读取到的堆内存末地址写入的数据是否为指定数据,确定堆内存是否发生堆内存写越界,进而实时的对越界记录文件进行更新。后续在向应用程序分配堆内存时,可以通过更新后的越界记录文件包括的记录,确定是否需要对堆内存进行扩充,以及内存扩充大小。因此,避免了越界记录文件不准确而导致的内存扩充大小不准确,进一步地,可以减少堆内存写越界发生的次数。
第二方面,提供了一种堆内存分配装置,所述堆内存分配装置具有实现上述第一方面中堆内存分配方法行为的功能。所述堆内存分配装置包括至少一个模块,该至少一个模块用于实现上述第一方面所提供的堆内存分配方法。
第三方面,提供了一种堆内存分配设备,所述堆内存分配设备包括处理器和存储器,所述存储器用于存储执行上述第一方面所提供的堆内存分配方法的程序,以及存储用于实现上述第一方面所提供的堆内存分配方法所涉及的数据。所述处理器被配置为用于执行所述存储器中存储的程序。所述存储设备的操作装置还可以包括通信总线,该通信总线用于该处理器与存储器之间建立连接。
第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面所述的堆内存分配方法。
第五方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面所述的堆内存分配方法。
上述第二方面、第三方面、第四方面和第五方面所获得的技术效果与第一方面中对应的技术手段获得的技术效果近似,在这里不再赘述。
本申请提供的技术方案至少可以带来以下有益效果:
在本申请中,当有应用程序申请堆内存时,可以在越界记录文件中查找目标记录,其中,目标记录包括文件名、行号和越界次数。由于目标记录的文件名和行号分别与应用程序对应的文件名和行号相同,因此,可以根据目标记录中的越界次数,确定理论内存扩充大小,进而按照应用程序申请的堆内存的大小和理论内存扩充大小,向应用程序分配堆内存。也即是,本申请提供的方法考虑了历史越界情况,按照历史越界情况向应用程序分配堆内存之后,可以减少堆内存写越界发生的次数。
附图说明
图1是本申请实施例提供的一种网络设备的结构示意图;
图2是本申请实施例提供的一种计算机设备的结构示意图;
图3是本申请实施例提供的一种堆内存分配方法的流程图;
图4是本申请实施例提供的一种堆内存的结构示意图;
图5是本申请实施例提供的一种堆内存分配装置的结构示意图;
图6是本申请实施例提供的另一种堆内存分配装置的结构示意图;
图7是本申请实施例提供的又一种堆内存分配装置的结构示意图;
图8是本申请实施例提供的再一种堆内存分配装置的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在对本申请实施例进行详细的解释说明之前,先对本申请实施例涉及的应用场景予以介绍。
本申请实施例提供的方法可以应用于网络设备中,也可以应用于计算机设备中。也即是,当网络设备或者计算机设备中的应用程序在运行的过程中,需要向操作系统申请堆内存时,都可以按照本申请实施例提供的方法来申请堆内存。其中,网络设备可以包括路由器、交换机、防火墙等设备,计算机设备可以包括终端、服务器等设备。
以路由器为例,由于路由器通常会在不同的时间处理不同的业务,而对于不同的业务,路由信息可能就会不同,也即是,路由信息会随着业务的改变而发生改变,因此,路由器中通常需要存储大量的路由信息。基于此,获取路由信息的应用程序可以申请堆内存,操作系统会向该应用程序分配堆内存,之后,路由器可以通过堆内存来存储大量的路由信息。
以数据库服务为例,由于数据库服务器中通常需要存储大量的数据库记录信息,因此,数据库服务器中用于获取数据库记录信息的应用程序可以申请堆内存,操作系统会向该应用程序分配堆内存,之后,数据库服务器可以通过堆内存来存储各种数据库记录信息。
需要说明的是,本申请实施例提供的方法还可以应用于任意一个需要动态内存来临时存储数据的场景,例如在查询场景下,需要动态内存来临时存储返回的查询结果;又例如在发送消息场景下,需要动态内存来临时存储编辑的消息内容。
上述应用场景仅是本申请实施例给出的可能的应用场景,当然,在另外一些可能的情况下,该堆内存分配方法也可以应用于其他场景中,本申请实施例对此不做限定。
请参考图1,图1是根据本申请实施例示出的一种网络设备的结构示意图。该网络设备包括至少一个处理器101、通信总线102、存储器103以及至少一个通信接口104。
处理器101可以是一个通用中央处理器(central processing unit,CPU)、网络处理器(NP)、微处理器、或者可以是一个或多个用于实现本申请方案的集成电路,例如,专用集成电路(application-specific integrated circuit,ASIC),可编程逻辑器件(programmable logic device,PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(complex programmable logic device,CPLD),现场可编程逻辑门阵列(field-programmable gate array,FPGA),通用阵列逻辑(generic array logic,GAL)或其任意组合。
通信总线102用于在上述组件之间传送信息。通信总线102可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器103可以是只读存储器(read-only memory,ROM)或可存储静态信息和指令的其它类型的静态存储设备,也可以是随机存取存储器(random access memory,RAM)或者可存储信息和指令的其它类型的动态存储设备,也可以是电可擦可编程只读存储器(electrically erasable programmable read-only memory,EEPROM)、只读光盘(compactdisc read-only memory,CD-ROM)或其它光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其它磁存储设备,或者是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其它介质,但不限于此。存储器103可以是独立存在,并通过通信总线102与处理器101相连接。存储器103也可以和处理器101集成在一起。
通信接口104使用任何收发器一类的装置,用于与其它设备或通信网络通信。通信接口104包括有线通信接口,还可以包括无线通信接口。其中,有线通信接口例如可以为以太网接口。以太网接口可以是光接口,电接口或其组合。无线通信接口可以为无线局域网(wireless local area networks,WLAN)接口,蜂窝网络通信接口或其组合等。
在具体实现中,作为一种实施例,处理器101可以包括一个或多个CPU,如图1中所示的CPU0和CPU1。
在具体实现中,作为一种实施例,网络设备可以包括多个处理器,如图1中所示的处理器101和处理器105。这些处理器中的每一个可以是一个单核处理器(single-CPU),也可以是一个多核处理器(multi-CPU)。这里的处理器可以指一个或多个设备、电路、和/或用于处理数据(如计算机程序指令)的处理核。
在具体实现中,作为一种实施例,网络设备还可以包括输出设备106和输入设备107。输出设备106和处理器101通信,可以以多种方式来显示信息。例如,输出设备106可以是液晶显示器(liquid crystal display,LCD)、发光二级管(light emitting diode,LED)显示设备、阴极射线管(cathode ray tube,CRT)显示设备或投影仪(projector)等。输入设备107和处理器101通信,可以以多种方式接收用户的输入。例如,输入设备107可以是鼠标、键盘、触摸屏设备或传感设备等。
在一些实施例中,存储器103用于存储执行本申请方案的程序代码110,处理器101可以执行存储器103中存储的程序代码110。也即是,网络设备可以通过处理器101以及存储器103中的程序代码110,来实现下文图3实施例提供的堆内存分配方法。
需要说明的是,本申请实施例提供的方法可以应用于集中式网络设备,也可以应用于分布式网络设备中。其中,集中式网络设备的结构可以如图1所示,分布式网络设备可以包括接口板和主控板,接口板和主控板的结构均可以如图1所示。也即是,接口板和主控板分别包括至少一个处理器101、通信总线102、存储器103以及至少一个通信接口104。换句话说,接口板和主控板分别相当于一个前述的集中式网络设备。
请参考图2,图2是根据本申请实施例示出的一种计算机设备的结构示意图。该计算机设备包括至少一个处理器201、通信总线202、存储器203以及至少一个通信接口204。
处理器201可以是一个通用中央处理器(central processing unit,CPU)、网络处理器(NP)、微处理器、或者可以是一个或多个用于实现本申请方案的集成电路,例如,专用集成电路(application-specific integrated circuit,ASIC),可编程逻辑器件(programmable logic device,PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(complex programmable logic device,CPLD),现场可编程逻辑门阵列(field-programmable gate array,FPGA),通用阵列逻辑(generic array logic,GAL)或其任意组合。
通信总线202用于在上述组件之间传送信息。通信总线202可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器203可以是只读存储器(read-only memory,ROM)或可存储静态信息和指令的其它类型的静态存储设备,也可以是随机存取存储器(random access memory,RAM)或者可存储信息和指令的其它类型的动态存储设备,也可以是电可擦可编程只读存储器(electrically erasable programmable read-only memory,EEPROM)、只读光盘(compactdisc read-only memory,CD-ROM)或其它光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其它磁存储设备,或者是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其它介质,但不限于此。存储器203可以是独立存在,并通过通信总线202与处理器201相连接。存储器203也可以和处理器201集成在一起。
通信接口204使用任何收发器一类的装置,用于与其它设备或通信网络通信。通信接口204包括有线通信接口,还可以包括无线通信接口。其中,有线通信接口例如可以为以太网接口。以太网接口可以是光接口,电接口或其组合。无线通信接口可以为无线局域网(wireless local area networks,WLAN)接口,蜂窝网络通信接口或其组合等。
在具体实现中,作为一种实施例,处理器201可以包括一个或多个CPU,如图2中所示的CPU0和CPU1。
在具体实现中,作为一种实施例,计算机设备可以包括多个处理器,如图2中所示的处理器201和处理器205。这些处理器中的每一个可以是一个单核处理器(single-CPU),也可以是一个多核处理器(multi-CPU)。这里的处理器可以指一个或多个设备、电路、和/或用于处理数据(如计算机程序指令)的处理核。
在具体实现中,作为一种实施例,计算机设备还可以包括输出设备206和输入设备207。输出设备206和处理器201通信,可以以多种方式来显示信息。例如,输出设备206可以是液晶显示器(liquid crystal display,LCD)、发光二级管(light emitting diode,LED)显示设备、阴极射线管(cathode ray tube,CRT)显示设备或投影仪(projector)等。输入设备207和处理器201通信,可以以多种方式接收用户的输入。例如,输入设备207可以是鼠标、键盘、触摸屏设备或传感设备等。
在一些实施例中,存储器203用于存储执行本申请方案的程序代码210,处理器201可以执行存储器203中存储的程序代码210。也即是,计算机设备可以通过处理器201以及存储器203中的程序代码210,来实现下文图3实施例提供的堆内存分配方法。
图3是本申请实施例提供的一种堆内存分配方法的流程图,该方法可以应用于图1所示的网络设备中,也可以应用于图2所示的计算机设备中。请参考图3,该方法包括如下步骤。
步骤301:获取当前申请堆内存的应用程序对应的文件名、行号和内存申请大小。
其中,文件名是指应用程序的源代码文件的名称,行号是指源代码文件中用于申请堆内存的代码所在行的编号,内存申请大小是指应用程序当前申请的堆内存的大小。
在本申请实施例中,操作系统可以接收当前申请堆内存的应用程序发送的堆内存申请消息,该堆内存申请消息中可以包括应用程序对应的文件名、行号以及内存申请大小,也即是,操作系统可以从接收到的堆内存申请消息中获取当前申请堆内存的应用程序对应的文件名、行号和内存申请大小。
需要说明的是,当应用程序在运行的过程中需要使用堆内存时,可以向操作系统申请堆内存,并同时向操作系统发送堆内存申请消息。其中,应用程序向操作系统发送堆内存申请消息的方式可以有多种,在此不做限定。
在一些实施例中,应用程序可以在运行的过程中调用堆内存分配函数,将内存申请大小作为堆内存分配函数的参数,向操作系统发送堆内存申请消息,以申请堆内存。
示例性地,上述堆内存分配函数可以为malloc()函数,将内存申请大小作为malloc()函数的参数,调用malloc()函数向操作系统发送堆内存申请消息,之后,malloc()函数会返回指向该堆内存首地址的指针。例如,应用程序使用malloc()函数申请堆内存的源代码为:
其中,第一列的数字为每一行所对应的行号,行号后面的内容为应用程序要执行的源代码。应用程序通过调用malloc()函数向操作系统申请10字节的堆内存,并向操作系统发送堆内存申请消息,操作系统可以根据堆内存申请消息,得到应用程序对应的文件名为test.c,行号为4,内存申请大小为10字节。
在另一些实施例中,应用程序可以在运行的过程中,将参考数据类型和内存申请大小作为堆内存分配运算符的操作数,通过堆内存分配运算符向操作系统发送堆内存申请消息。其中,参考数据类型是指应用程序当前申请的堆内存中存储的数据的类型,且该参考数据类型可以是应用程序事先设置的。
示例性地,上述堆内存分配运算符可以为new运算符,将参考数据类型和内存申请大小作为new运算符的操作数,使用new运算符向操作系统发送堆内存申请消息。例如,当应用程序使用new运算符向操作系统申请10字节大小、能够存储int(integer,整型)类型的数据的堆内存时,可以通过new int(10)语句向操作系统申请该堆内存。
需要说明的是,对于堆内存分配函数来说,通常只需要将内存申请大小作为堆内存分配函数的参数即可向操作系统申请堆内存。但是,对于堆内存运算符来说,不仅仅需要确定内存申请大小,还需要确定当前申请的堆内存存储的数据的类型,因此,通过堆内存运算符申请堆内存时,应用程序需要确定参考数据类型,进而将参考数据类型和内存申请大小作为堆内存运算符的操作数,进而向操作系统申请堆内存。
另外,上述是以堆内存分配函数和堆内存运算符为例,对应用程序向操作系统发送堆内存申请消息的方式进行说明,实际应用中,还可以通过其他的方式向操作系统发送堆内存申请消息,本申请实施例不再一一列出。
步骤302:从越界记录文件中查找目标记录。
需要说明的是,操作系统所在设备的磁盘中存储有一个越界记录文件,该越界记录文件包括多条记录,每条记录包括文件名、行号和越界次数,目标记录是指多条记录中包括的文件名和行号分别与应用程序对应的文件名和行号相同的记录。
操作系统获取到应用程序对应的文件名、行号和内存申请大小后,可以读取越界记录文件。之后,可以通过应用程序对应的文件名和行号,在越界记录文件包括的多条记录中查找文件名和行号分别与应用程序对应的文件名和行号相同的一条记录,并将查找到的这条记录作为目标记录。
其中,操作系统可以按照下述两种不同的实现方式,在越界记录文件中查找目标记录。
在一种可能的实现方式中,操作系统可以将应用程序对应的文件名和行号同时与越界记录文件包括的多条记录中的文件名和行号进行对比,确定多条记录中文件名和行号分别与应用程序对应的文件名和行号相同的一条记录,将这条记录作为目标记录。
在另一种可能的实现方式中,操作系统可以先将应用程序对应的文件名与越界记录文件包括的多条记录中的文件名进行对比,确定文件名与应用程序对应的文件名相同的一条或多条记录。之后,可以通过应用程序对应的行号与确定的一条或多条记录中的行号进行对比,确定行号也与应用程序对应的行号相同的一条记录。也即是,得到多条记录中的文件名和行号分别与应用程序对应的文件名和行号相同的一条记录,将这条记录作为目标记录。
例如,应用程序对应的文件名为test.c,行号为4,操作系统读取到的越界记录文件可以参见下述表1。此时,操作系统可以通过应用程序对应的文件名test.c和行号4与多条记录中的文件名和行号分别进行对比,得到文件名为test.c,行号为4,越界次数为3的这条记录,将这条记录作为目标记录。
表1
记录编号 | 文件名 | 行号 | 越界次数 |
1 | test.c | 4 | 3 |
2 | read.c | 12 | 1 |
需要说明的是,在上述第二种可能的实现方式中,操作系统是先通过文件名查找一部分记录,之后,再通过行号从查找到的这部分记录中进行筛选,从而得到目标记录。可选地,操作系统也可以先通过行号查找一部分记录,之后,再通过文件名从查找到的这部分记录中进行筛选,从而得到目标记录。
步骤303:如果查找到目标记录,则根据目标记录包括的越界次数,确定理论内存扩充大小。
操作系统在越界记录文件中查找到目标记录后,可以根据目标记录包括的越界次数确定理论内存扩充大小。在本申请实施例中,操作系统可以按照下述两种不同的实现方式,根据目标记录包括的越界次数确定理论内存扩充大小。
在一种可能的实现方式中,操作系统可以将目标记录包括的越界次数与单次扩充大小之间的乘积,确定为理论内存扩充大小。
其中,单次扩充大小是一个可以根据经验预先设置的扩充大小。示例性地,在本申请实施例中,单次扩充大小可以为1024字节。
继续上述举例,应用程序对应的文件名为test.c,行号为4,操作系统在越界记录文件中查找到的目标记录包括的文件名为test.c,行号为4,越界次数为3,则可以确定应用程序对应的文件名和行号申请的堆内存发生过3次堆内存写越界。之后,操作系统可以计算越界次数与单次扩充大小的乘积为3×1024=3072字节,则确定理论内存扩充大小为3072字节。
在另一种可能的实现方式中,越界记录文件的每条记录中还包括每一次越界的越界大小。操作系统可以获取目标记录中包括的越界次数和每一次越界的越界大小,将每一次越界的越界大小进行求和,再除以越界次数,得到平均越界大小,将该平均越界大小确定为理论内存扩充大小。
继续上述举例,应用程序对应的文件名为test.c,行号为4,操作系统在越界记录文件中查找到的目标记录包括的文件名为test.c,行号为4,越界次数为3,越界大小分别为300字节、300字节和100字节。之后,操作系统可以计算越界大小之和为300+300+100=600字节,再除以越界次数3,得到平均越界大小为600/3=300字节,则确定理论内存扩充大小为300字节。
需要说明的是,操作系统不仅可以通过上述两种方式来确定理论内存扩充大小,还可以通过其他的方式来确定理论内存扩充大小,本申请实施例不再一一列举。
步骤304:根据内存申请大小和理论内存扩充大小,向应用程序分配堆内存。
在本申请实施例中,对于应用程序申请的堆内存进行扩充时存在一定的门限,也即内存扩充门限。因此,操作系统根据上述的步骤303确定理论内存扩充大小后,可以将理论内存扩充大小与内存扩充门限进行比较。但是,由于理论内存扩充大小存在没有超过和超过内存扩充门限这两种情况,而且,对于这两种情况,操作系统向应用程序分配堆内存的方法也不同,因此,接下来将通过下述两种不同的方式进行说明。
在一种可能的实现方式中,如果理论内存扩充大小没有超过内存扩充门限,则将理论内存扩充大小作为实际内存扩充大小,根据内存申请大小和实际内存扩充大小,向应用程序分配堆内存。
需要说明的是,操作系统中存储有一个预先设置好的内存扩充门限,该内存扩充门限用于指示可以向应用程序分配的最大扩充内存。由于理论内存扩充大小没有超过内存扩充门限,因此,可以将理论内存扩充大小作为实际内存扩充大小。
操作系统将理论内存扩充大小作为实际内存扩充大小后,可以计算应用程序的内存申请大小与实际内存扩充大小之和,得到第一内存大小,将第一内存大小作为应该分配给应用程序的堆内存的大小。之后,操作系统可以根据第一内存大小,向应用程序分配堆内存。
作为一种示例,操作系统可以在未分配内存链表中查找内存大小等于或大于第一内存大小的内存块。如果操作系统查找到满足前述条件的内存块,且该内存块的内存大小大于第一内存大小,则可以从该内存块的首地址开始,在内存块中划分出第一内存大小的内存,将该内存作为堆内存分配给应用程序。如果操作系统查找到满足前述条件的内存块,且该内存块的内存大小等于第一内存大小,则可以将该内存块作为堆内存分配给应用程序。
需要说明的是,未分配内存链表用于指示当前未分配的空闲内存,且未分配内存链表中包括多个结点,每个结点用于表示一个内存块,且每个结点中可以包括该结点表示的内存块的首地址和末地址。操作系统可以通过未分配内存链表来查找当前操作系统中未分配的空闲内存的首地址和末地址,进一步可以通过首地址和末地址确定未分配的空闲内存的大小,从而便于对未分配的空闲内存进行分配。
进一步地,在操作系统按照未分配内存链表,向应用程序分配堆内存之后,操作系统还可以对未分配内存链表进行更新。在一些实施例中,如果操作系统分配给应用程序堆内存后,内存块还有剩余的部分内存,那么,操作系统可以将用于表示这个内存块的结点包括的首地址更新为剩余的部分内存的首地址。如果操作系统分配给应用程序堆内存后,内存块没有剩余的内存,那么,操作系统可以将用于表示这个内存块的结点删除。
在另一种可能的实现方式中,如果理论内存扩充大小超过内存扩充门限,则将内存扩充门限作为实际内存扩充大小,根据内存申请大小和实际内存扩充大小,向应用程序分配堆内存。
操作系统将内存扩充门限作为应用程序的实际内存扩充大小后,可以计算应用程序的内存申请大小与实际内存扩充大小之和,得到第二内存大小。将第二内存大小作为应该分配给应用程序的堆内存的大小。之后,操作系统可以根据第二内存大小,向应用程序分配堆内存。其中,操作系统向应用程序分配堆内存的具体过程,与前述第一种可能的实现方式中的具体过程相同,在此不再赘述。
需要说明的是,如果理论内存扩充大小超过内存扩充门限,那么操作系统将理论内存扩充大小作为实际内存扩充大小的话,分配给应用程序堆内存可能会占用过大的内存空间,影响操作系统的正常运行。因此,在理论内存扩充大小超过内存扩充门限时,可以将内存扩充门限作为实际内存扩充大小。也即是,限定一个最大的实际内存扩充大小,从而可以避免操作系统向应用程序分配过大的堆内存,导致操作系统不能正常运行。
在本申请实施例中,当操作系统每向应用程序分配一个包含扩充内存的堆内存或释放一个包含扩充内存的堆内存时,需要对内存扩充门限进行更新。具体的,每向应用程序分配一个包含扩充内存的堆内存时,可以用内存扩充门限减去已分配堆内存的实际内存扩充大小,得到更新后的内存扩充门限,同样的,当释放一个包含扩充内存的堆内存时,可以计算释放的堆内存的实际内存扩充大小与内存扩充门限之和,得到更新后的内存扩充门限。
请参考图4,在本申请实施例中,堆内存的结构可以包括内存头、数据和指定数据这三个部分。内存头部分包括文件名、行号、申请大小、扩充大小、申请链指针和释放链指针这六个字段,且每个字段的长度是固定的,也即是,内存头的长度是固定的。
其中,文件名字段的长度可以为4字节,用于指示应用程序的源代码文件的名称。行号字段的长度可以为4字节,用于指示源代码文件中用于申请堆内存的代码所在行的编号。申请大小字段的长度可以为4字节,用于指示应用程序申请的堆内存的大小,也即是内存申请大小。扩充大小字段的长度可以为12字节,用于指示分配给应用程序的堆内存的实际内存扩充大小。申请链指针字段的长度可以为4字节,用于指向内存头部分的首地址,也即是,该堆内存占用操作系统的内存的首地址。释放链指针字段的长度可以为4字节,用于指向数据部分的首地址,也即是,应用程序可以识别的堆内存的首地址。通过上述各个字段的长度可以确定内存头的长度为32字节。
因此,操作系统根据内存申请大小和实际内存扩充大小,向应用程序分配堆内存之后,可以将应用程序的源代码文件的名称写入文件名字段中,将源代码文件中用于申请堆内存的代码所在行的编号写入行号字段中,将内存申请大小写入申请大小字段中,将实际内存扩充大小写入扩充大小字段中。
值得注意的是,上述堆内存的内存头为操作系统自动添加在数据部分之前的,属于内存开销,并不占用应用程序申请的堆内存的大小,且对于应用程序是不可见的。也即是,应用程序申请的堆内存大小为数据及指定数据这两部分所占用的内存大小。但是,实际占用操作系统的内存大小为内存头、数据及指定数据这三部分所占用的内存大小。
示例性地,应用程序向操作系统申请64字节的堆内存,操作系统在向应用程序分配64字节的堆内存时,会自动在该堆内存前添加一个32字节的内存头。也即是,应用程序虽只向操作系统申请64字节的堆内存,但该堆内存实际占用操作系统的内存大小为64+32=96字节。
在理论内存扩充大小超过内存扩充门限的情况下,将内存扩充门限作为实际内存扩充大小只是一种实现方式,在另一些实施例中,也可以不进行内存扩充,也即是,直接根据内存申请大小,向应用程序分配堆内存。在这种情况下,内存头中的扩充大小中写入的实际内存扩充大小为0。
前述的堆内存分配方法为操作系统在越界记录文件中查找到目标记录之后,向应用程序分配堆内存的方法。然而,在一些实施例中,操作系统在越界记录文件中也可能未查找到目标记录。此时,操作系统可以根据内存申请大小,向应用程序分配堆内存。也即是,在这种情况下,操作系统不会对应用程序申请的堆内存大小进行扩充,而是直接将应用程序的内存申请大小作为分配给应用程序的堆内存的大小,进而向应用程序分配堆内存。在这种情况下,内存头中的扩充大小中写入的实际内存扩充大小为0。其中,操作系统向应用程序分配堆内存的具体过程与前述相同,在此不再赘述。
为了减少后续分配的堆内存发生写越界的次数,操作系统在向应用程序分配堆内存时,会在堆内存的末地址中写入一个指定数据,该指定数据用于标识该指定数据所在的地址为堆内存的末地址。之后,操作系统可以根据堆内存的末地址写入的数据,检测堆内存是否发生堆内存写越界,并对越界记录文件进行更新。
在一些实施例中,操作系统可以根据当前分配给应用程序的堆内存的内存头,获取当前分配给应用程序的堆内存的末地址写入的数据。如果当前分配给应用程序的堆内存的末地址写入的数据不为指定数据,则确定当前已发生堆内存写越界,根据应用程序对应的文件名和行号,对目标记录包括的越界次数进行更新。如果当前分配给应用程序的堆内存的末地址写入的数据为指定数据,则确定当前未发生堆内存写越界。
由于内存头中的释放链指针字段中写入指向数据部分的首地址,申请大小字段中写入内存申请大小,扩充大小字段中写入实际内存扩充大小,因此,可以确定申请大小字段中写入的内存申请大小与扩充大小字段中写入的实际内存扩充大小之和,得到第三内存大小。之后,根据释放链指针字段中写入的地址与第三内存大小,确定操作系统分配给应用程序的堆内存的末地址,也即是,指定数据部分的地址,进而可以读取分配给应用程序的堆内存的末地址写入的数据。
在本申请实施例中,操作系统可以在应用程序使用堆内存的过程中进行检测,也可以在释放堆内存时进行检测。如果操作系统在应用程序使用堆内存的过程中进行检测,那么操作系统可以周期地扫描已分配内存链表,获取已分配内存链表中记录的每个堆内存的内存首地址。之后,操作系统可以获取每个堆内存的内存头,并根据内存首地址和内存头,获取每个堆内存的末地址写入的数据,从而确定是否发生堆内存写越界。如果操作系统在释放堆内存时进行检测,那么操作系统可以获取已分配内存链表中当前释放的堆内存的内存头,并根据当前释放的堆内存的内存首地址和内存头,获取当前释放的堆内存的末地址写入的数据,从而确定是否发生堆内存写越界。
由于操作系统在向应用程序分配堆内存后,会给应用程序返回内存首地址,该内存首地址为数据部分的首地址,也即是,返回释放链指针指向的地址。同时操作系统会在已分配内存链表中记录分配给应用程序的堆内存的内存首地址。因此,操作系统通过扫描已分配内存链表,可以从已分配内存链表中获取到每个堆内存的内存首地址。另外,由于应用程序释放堆内存时,可以向操作系统发送内存释放消息,该内存释放消息中可以携带当前释放的堆内存的首地址。因此,操作系统在释放堆内存时进行写越界检测的话,可以直接从内存释放消息中获取当前释放的堆内存的首地址,而无需对已分配内存链表进行扫描。
此外,由于内存头的长度和内存头中每个字段的长度均是固定的,因此,操作系统可以根据内存首地址和内存头的长度,从内存头中识别出每个字段中的数据,进而能够获取到申请大小字段中写入的内存申请大小,以及扩充大小字段中写入的实际内存扩充大小。
其中,操作系统根据应用程序对应的文件名和行号,对目标记录包括的越界次数进行更新的实现方式可以为:操作系统可以根据该应用程序对应的文件名和行号,在越界记录文件中查找目标记录,增加目标记录包括的越界次数。
示例性地,应用程序对应的文件名为test.c,行号为4,越界记录文件可以参见上述例子中的表1。操作系统在越界记录文件中查找到与文件名test.c,行号4对应的目标记录,该目标记录包括的越界次数为3,此时,操作系统会将越界次数增加1次。也即是,更新后的越界记录文件参见下述表2。
表2
记录编号 | 文件名 | 行号 | 越界次数 |
1 | test.c | 4 | 4 |
2 | read.c | 12 | 1 |
在本申请实施例中,有的堆内存在当前时间之前可能未发生过堆内存写越界。对于这种情况,操作系统可以根据应用程序对应的文件名和行号,在越界记录文件中生成一条新的记录,并在该记录的越界次数中写入初值。其中,初值可以为1,也可以为2、3等等。
示例性地,应用程序对应的文件名为delete.c,行号为20,越界记录文件可以参见上述表1。操作系统在越界记录文件中未查找到与文件名delete.c,行号20对应的记录,此时,操作系统会在越界记录文件中生成一条新的记录。假设初值为1,那么操作系统在生成这条新的记录之后,可以在该记录包括的越界次数中写入1,也即是,更新后的越界记录文件参见下述表3。
表3
需要说明的是,应用程序释放堆内存时,可以根据申请堆内存的方法的不同,使用不同的方法进行堆内存的释放。例如,使用堆内存分配函数malloc()申请的堆内存,可以使用堆内存释放函数free()进行释放。使用堆内存分配运算符new申请的堆内存,可以使用堆内存释放运算符delete进行释放。
在本申请实施例中,当有应用程序申请堆内存时,可以在越界记录文件中查找目标记录,其中,目标记录包括文件名、行号和越界次数。由于目标记录的文件名和行号分别与应用程序对应的文件名和行号相同,因此,可以根据目标记录中的越界次数,确定理论内存扩充大小,进而按照应用程序申请的堆内存的大小和理论内存扩充大小,向应用程序分配堆内存。也即是,本申请提供的方法考虑了历史越界情况,按照历史越界情况向应用程序分配堆内存之后,可以减少堆内存写越界发生的次数。
图5是本申请实施例提供的一种堆内存分配装置的结构示意图,该堆内存分配装置可以由软件、硬件或者两者的结合实现,该堆内存分配设备可以为图1或图2所示的网络设备或计算机设备。参见图5,该装置包括:第一获取模块501、查找模块502、确定模块503和第一分配模块504。
第一获取模块501,用于执行图3实施例中的步骤301的操作;
查找模块502,用于执行图3实施例中的步骤302的操作;
确定模块503,用于执行图3实施例中的步骤303的操作;
第一分配模块504,用于执行图3实施例中的步骤304的操作。
可选地,确定模块503具体用于:
将目标记录包括的越界次数与单次扩充大小之间的乘积,确定为理论内存扩充大小。
可选地,第一分配模块504具体用于:
如果理论内存扩充大小没有超过内存扩充门限,则将理论内存扩充大小作为实际内存扩充大小,根据内存申请大小和实际内存扩充大小,向应用程序分配堆内存。
可选地,第一分配模块504具体用于:
如果理论内存扩充大小超过内存扩充门限,则将内存扩充门限作为实际内存扩充大小,根据内存申请大小和实际内存扩充大小,向应用程序分配堆内存。
可选地,应用程序的堆内存的内存头包括扩充大小字段;
参见图6,该装置还包括:
写入模块505,用于将实际内存扩充大小写入扩充大小字段中。
可选地,参见图7,该装置还包括:
第二分配模块506,用于如果未查找到目标记录,则根据内存申请大小,向应用程序分配堆内存。
可选地,参见图8,该装置还包括:
第二获取模块507,用于根据当前分配给应用程序的堆内存的内存头,获取当前分配给应用程序的堆内存的末地址写入的数据;
更新模块508,用于如果当前分配给应用程序的堆内存的末地址写入的数据不为指定数据,则确定当前已发生堆内存写越界,根据应用程序对应的文件名和行号,对目标记录包括的越界次数进行更新。
在本申请实施例中,当有应用程序申请堆内存时,可以在越界记录文件中查找目标记录,其中,目标记录包括文件名、行号和越界次数。由于目标记录的文件名和行号分别与应用程序对应的文件名和行号相同,因此,可以根据目标记录中的越界次数,确定理论内存扩充大小,进而按照应用程序申请的堆内存的大小和理论内存扩充大小,向应用程序分配堆内存。也即是,本申请提供的方法考虑了历史越界情况,按照历史越界情况向应用程序分配堆内存之后,可以减少堆内存写越界发生的次数。
需要说明的是:上述实施例提供的堆内存分配装置在分配堆内存时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的堆内存分配装置与堆内存分配方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络或其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如:同轴电缆、光纤、数据用户线(Digital Subscriber Line,DSL))或无线(例如:红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质,或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如:软盘、硬盘、磁带)、光介质(例如:数字通用光盘(Digital Versatile Disc,DVD))或半导体介质(例如:固态硬盘(Solid State Disk,SSD))等。值得注意的是,本申请提到的计算机可读存储介质可以为非易失性存储介质,换句话说,可以是非瞬时性存储介质。
以上所述为本申请提供的实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (15)
1.一种堆内存分配方法,其特征在于,所述方法包括:
获取当前申请堆内存的应用程序对应的文件名、行号和内存申请大小,所述文件名是指所述应用程序的源代码文件的名称,所述行号是指所述源代码文件中用于申请堆内存的代码所在行的编号,所述内存申请大小是指所述应用程序当前申请的堆内存的大小;
从越界记录文件中查找目标记录,其中,所述越界记录文件包括多条记录,每条记录包括文件名、行号和越界次数,所述目标记录是指所述多条记录中包括的文件名和行号分别与所述应用程序对应的文件名和行号相同的记录;
如果查找到所述目标记录,则根据所述目标记录包括的越界次数,确定理论内存扩充大小;
根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存。
2.如权利要求1所述的方法,其特征在于,所述根据所述目标记录包括的越界次数,确定理论内存扩充大小,包括:
将所述目标记录包括的越界次数与单次扩充大小之间的乘积,确定为所述理论内存扩充大小。
3.如权利要求1所述的方法,其特征在于,所述根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存,包括:
如果所述理论内存扩充大小没有超过内存扩充门限,则将所述理论内存扩充大小作为实际内存扩充大小,根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存。
4.如权利要求1所述的方法,其特征在于,所述根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存,包括:
如果所述理论内存扩充大小超过内存扩充门限,则将所述内存扩充门限作为实际内存扩充大小,根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存。
5.如权利要求3或4所述的方法,其特征在于,所述应用程序的堆内存的内存头包括扩充大小字段;
所述根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存之后,还包括:
将所述实际内存扩充大小写入所述扩充大小字段中。
6.如权利要求1所述的方法,其特征在于,所述从越界记录文件中查找目标记录之后,还包括:
如果未查找到所述目标记录,则根据所述内存申请大小,向所述应用程序分配堆内存。
7.如权利要求1-6任一所述的方法,其特征在于,所述根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存之后,还包括:
根据当前分配给所述应用程序的堆内存的内存头,获取当前分配给所述应用程序的堆内存的末地址写入的数据;
如果当前分配给所述应用程序的堆内存的末地址写入的数据不为指定数据,则确定当前已发生堆内存写越界,根据所述应用程序对应的文件名和行号,对所述目标记录包括的越界次数进行更新。
8.一种堆内存分配装置,其特征在于,所述装置包括:
第一获取模块,用于获取当前申请堆内存的应用程序对应的文件名、行号和内存申请大小,所述文件名是指所述应用程序的源代码文件的名称,所述行号是指所述源代码文件中用于申请堆内存的代码所在行的编号,所述内存申请大小是指所述应用程序当前申请的堆内存的大小;
查找模块,用于从越界记录文件中查找目标记录,其中,所述越界记录文件包括多条记录,每条记录包括文件名、行号和越界次数,所述目标记录是指所述多条记录中包括的文件名和行号分别与所述应用程序对应的文件名和行号相同的记录;
确定模块,用于如果查找到所述目标记录,则根据所述目标记录包括的越界次数,确定理论内存扩充大小;
第一分配模块,用于根据所述内存申请大小和所述理论内存扩充大小,向所述应用程序分配堆内存。
9.如权利要求8所述的装置,其特征在于,所述确定模块具体用于:
将所述目标记录包括的越界次数与单次扩充大小之间的乘积,确定为所述理论内存扩充大小。
10.如权利要求8所述的装置,其特征在于,所述第一分配模块具体用于:
如果所述理论内存扩充大小没有超过内存扩充门限,则将所述理论内存扩充大小作为实际内存扩充大小,根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存。
11.如权利要求8所述的装置,其特征在于,所述第一分配模块具体用于:
如果所述理论内存扩充大小超过内存扩充门限,则将所述内存扩充门限作为实际内存扩充大小,根据所述内存申请大小和所述实际内存扩充大小,向所述应用程序分配堆内存。
12.如权利要求10或11所述的装置,其特征在于,所述应用程序的堆内存的内存头包括扩充大小字段;
所述装置还包括:
写入模块,用于将所述实际内存扩充大小写入所述扩充大小字段中。
13.如权利要求8所述的装置,其特征在于,所述装置还包括:
第二分配模块,用于如果未查找到所述目标记录,则根据所述内存申请大小,向所述应用程序分配堆内存。
14.如权利要求8-13任一所述的装置,其特征在于,所述装置还包括:
第二获取模块,用于根据当前分配给所述应用程序的堆内存的内存头,获取当前分配给所述应用程序的堆内存的末地址写入的数据;
更新模块,用于如果当前分配给所述应用程序的堆内存的末地址写入的数据不为指定数据,则确定当前已发生堆内存写越界,根据所述应用程序对应的文件名和行号,对所述目标记录包括的越界次数进行更新。
15.一种计算机可读存储介质,其特征在于,所述存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1-7任一所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910967329.8A CN112650692A (zh) | 2019-10-12 | 2019-10-12 | 堆内存分配方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910967329.8A CN112650692A (zh) | 2019-10-12 | 2019-10-12 | 堆内存分配方法、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112650692A true CN112650692A (zh) | 2021-04-13 |
Family
ID=75343734
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910967329.8A Pending CN112650692A (zh) | 2019-10-12 | 2019-10-12 | 堆内存分配方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112650692A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113791988A (zh) * | 2021-11-17 | 2021-12-14 | 畅捷通信息技术股份有限公司 | 一种降低小程序包体积的渲染方法、装置及存储介质 |
CN113805971A (zh) * | 2021-09-23 | 2021-12-17 | 武汉深之度科技有限公司 | 一种应用程序运行方法、计算设备及存储介质 |
CN113886114A (zh) * | 2021-09-03 | 2022-01-04 | 上海弘积信息科技有限公司 | 一种内存泄漏的定位方法 |
-
2019
- 2019-10-12 CN CN201910967329.8A patent/CN112650692A/zh active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113886114A (zh) * | 2021-09-03 | 2022-01-04 | 上海弘积信息科技有限公司 | 一种内存泄漏的定位方法 |
CN113886114B (zh) * | 2021-09-03 | 2023-09-01 | 上海弘积信息科技有限公司 | 一种内存泄漏的定位方法 |
CN113805971A (zh) * | 2021-09-23 | 2021-12-17 | 武汉深之度科技有限公司 | 一种应用程序运行方法、计算设备及存储介质 |
CN113805971B (zh) * | 2021-09-23 | 2023-10-13 | 武汉深之度科技有限公司 | 一种应用程序运行方法、计算设备及存储介质 |
CN113791988A (zh) * | 2021-11-17 | 2021-12-14 | 畅捷通信息技术股份有限公司 | 一种降低小程序包体积的渲染方法、装置及存储介质 |
CN113791988B (zh) * | 2021-11-17 | 2022-02-18 | 畅捷通信息技术股份有限公司 | 一种降低小程序包体积的渲染方法、装置及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6542909B2 (ja) | ファイル操作方法及び装置 | |
CN108897628A (zh) | 一种分布式锁的实现方法、装置及电子设备 | |
CN112650692A (zh) | 堆内存分配方法、装置及存储介质 | |
CN113849339B (zh) | 恢复应用程序的运行状态的方法、装置及存储介质 | |
EP3958122A1 (en) | Memory management method, apparatus, and system | |
US10102046B2 (en) | In-memory data analytic system that provides an integrated tracking mechanism for explicit memory resources | |
CN103716383A (zh) | 一种访问共享资源的方法及装置 | |
CN106802939A (zh) | 一种解决数据冲突的方法和系统 | |
CN108268216A (zh) | 数据处理方法、装置及服务器 | |
CN106933512B (zh) | 一种数据读写的方法及其设备 | |
CN111064786B (zh) | 账户标识管理方法及设备 | |
CN114556309A (zh) | 内存空间的分配方法、装置及存储介质 | |
EP3964996A1 (en) | Database access method and device | |
CN111209304B (zh) | 数据处理方法、装置及系统 | |
CN110554905A (zh) | 一种容器的启动方法及装置 | |
CN115480704A (zh) | 数据块组迁移映射表的构建方法、装置、设备及存储介质 | |
CN112269665B (zh) | 内存的处理方法和装置、电子设备和存储介质 | |
CN113342270A (zh) | 卷卸载方法、装置和电子设备 | |
CN114443598A (zh) | 写数据方法、装置、计算机设备及存储介质 | |
CN112114962A (zh) | 一种内存分配方法及装置 | |
CN107305582B (zh) | 一种元数据处理方法及装置 | |
CN115865839B (zh) | Acl管理方法、装置、通信设备及存储介质 | |
CN113326171B (zh) | 内存数据处理方法、装置和电子设备 | |
US20140201493A1 (en) | Optimizing large page processing | |
CN117056244A (zh) | 一种内存管理方法、装置、设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20210413 |
|
WD01 | Invention patent application deemed withdrawn after publication |