CN111488256B - 内存监控方法、装置、设备及存储介质 - Google Patents

内存监控方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN111488256B
CN111488256B CN202010272600.9A CN202010272600A CN111488256B CN 111488256 B CN111488256 B CN 111488256B CN 202010272600 A CN202010272600 A CN 202010272600A CN 111488256 B CN111488256 B CN 111488256B
Authority
CN
China
Prior art keywords
memory
monitoring object
data
monitoring
target
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
Application number
CN202010272600.9A
Other languages
English (en)
Other versions
CN111488256A (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.)
Netease Hangzhou Network Co Ltd
Original Assignee
Netease Hangzhou Network 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 Netease Hangzhou Network Co Ltd filed Critical Netease Hangzhou Network Co Ltd
Priority to CN202010272600.9A priority Critical patent/CN111488256B/zh
Publication of CN111488256A publication Critical patent/CN111488256A/zh
Application granted granted Critical
Publication of CN111488256B publication Critical patent/CN111488256B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • G06F11/3037Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a memory, e.g. virtual memory, cache
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3065Monitoring arrangements determined by the means or processing involved in reporting the monitored data

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请提供一种内存监控方法、装置、设备及存储介质。该方法包括:在接收到针对应用程序中的监控对象的修改请求时,根据所述修改请求,对所述监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值;输出所述内存占用值。本申请能够在修改监控对象的数据后,及时统计监控对象占用的内存,从而提高内存监控的实时性。

Description

内存监控方法、装置、设备及存储介质
技术领域
本申请涉及计算机技术领域,尤其涉及一种内存监控方法、装置、设备及存储介质。
背景技术
由于程序设计错误等原因,应用程序在网络设备上运行时可能发生内存泄漏。内存泄漏是指应用程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成网络设备内存的浪费,会导致应用程序运行速度减慢甚至闪退。通常对应用程序的对象的内存占用进行监控,以便及时发现发生内存泄漏的对象。
一般地,通过轮询方式监控对象占用的内存变化。在需要监控应用程序的某个对象的内存变化时,通常会注册一个定时器,每隔一段时间定时对该对象的内存占用大小进行统计。
然而,为避免影响应用程序的运行性能,通常设置的轮询的间隔时间较长,导致内存监控的实时性较差。
发明内容
本申请实施例提供一种内存监控方法、装置、设备及存储介质,以解决内存监控的实时性较差的问题。
第一方面,本申请实施例提供一种内存监控方法,包括:
在接收到针对应用程序中的监控对象的修改请求时,根据所述修改请求,对所述监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值;
输出所述内存占用值。
在一种可能的实施方式中,所述监控对象中包括至少一个修改方法函数,每个修改方法函数对应于一个方法标识,所述修改请求中包括目标方法标识,所述修改请求用于请求调用所述目标方法标识对应的目标修改方法函数;
根据所述修改请求,对所述监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,包括:
根据所述修改请求,确定所述目标修改方法函数;
在预置的替换函数中,确定所述目标修改方法函数对应的替换函数,其中,所述监控对象的每个修改方法函数与每个替换函数之间一一对应,其中,替换函数用于对监控对象的数据进行修改、以及对修改后的监控对象占用的内存进行统计;
调用所述目标修改方法函数对应的替换函数,以对所述监控对象的数据进行修改、并对修改后的监控对象占用的内存进行统计。
在一种可能的实施方式中,所述监控对象为基于python语言的对象,所述监控对象与描述符绑定,所述描述符中包括每个修改方法函数对应的替换函数;
在预置的替换函数中,确定所述目标修改方法函数对应的替换函数,包括:
在所述描述符中确定所述目标修改方法函数对应的替换函数。
在一种可能的实施方式中,所述监控对象中包括至少一个属性,每个属性对应于一个属性标识,所述修改请求中包括目标属性标识;
根据所述修改请求,对所述监控对象的数据进行修改,包括:
根据所述修改请求,对所述监控对象中所述目标属性标识对应的属性的数据进行修改。
在一种可能的实施方式中,所述方法还包括:
在接收到针对所述应用程序中的监控对象的获取请求时,其中,所述获取请求中包括所述目标属性标识,获取所述目标属性标识对应的属性的数据;
确定所述目标属性标识对应的属性的数据是否为不可变数据类型;
若是,则返回所述目标属性标识对应的属性的数据;
否则,将所述目标属性标识对应的属性的数据设置为新增的监控对象,并返回所述目标属性标识对应的属性的数据。
在一种可能的实施方式中,所述方法还包括:
在所述监控对象存在子对象且所述子对象被监控时,若接收到针对应用程序中的监控对象的子对象的修改请求,则对所述子对象的数据进行修改,并对所述监控对象占用的内存进行统计。
在一种可能的实施方式中,对修改后的监控对象占用的内存进行统计,得到内存占用值,包括:
确定所述监控对象是否为可变数据类型;
若是,则遍历统计所述监控对象中各个属性的数据占用的内存之和作为所述监控对象的内存占用值。
在一种可能的实施方式中,所述方法还包括:
根据所述内存占用值,确定所述监控对象是否发生内存泄漏;
若是,则执行以下中的至少一个步骤:
显示发生内存泄漏的提示消息;
触发垃圾回收机制进行内存回收;
向所述监控终端发送发生内存泄漏的提示消息。
第二方面,本申请实施例提供一种内存监控装置,包括:
处理模块,用于在接收到针对应用程序中的监控对象的修改请求时,根据所述修改请求,对所述监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值;
输出模块,输出所述内存占用值。
在一种可能的实施方式中,所述监控对象中包括至少一个修改方法函数,每个修改方法函数对应于一个方法标识,所述修改请求中包括目标方法标识,所述修改请求用于请求调用所述目标方法标识对应的目标修改方法函数;
所述处理模块,具体用于:
根据所述修改请求,确定所述目标修改方法函数;
在预置的替换函数中,确定所述目标修改方法函数对应的替换函数,其中,所述监控对象的每个修改方法函数与每个替换函数之间一一对应,其中,替换函数用于对监控对象的数据进行修改、以及对修改后的监控对象占用的内存进行统计;
调用所述目标修改方法函数对应的替换函数,以对所述监控对象的数据进行修改、并对修改后的监控对象占用的内存进行统计。
在一种可能的实施方式中,所述监控对象为基于python语言的对象,所述监控对象与描述符绑定,所述描述符中包括每个修改方法函数对应的替换函数;
所述处理模块,具体用于:
在所述描述符中确定所述目标修改方法函数对应的替换函数。
在一种可能的实施方式中,所述监控对象中包括至少一个属性,每个属性对应于一个属性标识,所述修改请求中包括目标属性标识;
所述处理模块,具体用于:
根据所述修改请求,对所述监控对象中所述目标属性标识对应的属性的数据进行修改。
在一种可能的实施方式中,所述处理模块,还用于:
在接收到针对所述应用程序中的监控对象的获取请求时,其中,所述获取请求中包括所述目标属性标识,获取所述目标属性标识对应的属性的数据;
确定所述目标属性标识对应的属性的数据是否为不可变数据类型;
若是,则返回所述目标属性标识对应的属性的数据;
否则,将所述目标属性标识对应的属性的数据设置为新增的监控对象,并返回所述目标属性标识对应的属性的数据。
在一种可能的实施方式中,所述处理模块,还用于:
在所述监控对象存在子对象且所述子对象被监控时,若接收到针对应用程序中的监控对象的子对象的修改请求,则对所述子对象的数据进行修改,并对所述监控对象占用的内存进行统计。
在一种可能的实施方式中,所述处理模块,具体用于:
确定所述监控对象是否为可变数据类型;
若是,则遍历统计所述监控对象中各个属性的数据占用的内存之和作为所述监控对象的内存占用值。
在一种可能的实施方式中,所述处理模块,还用于:
根据所述内存占用值,确定所述监控对象是否发生内存泄漏;
若是,则执行以下中的至少一个步骤:
显示发生内存泄漏的提示消息;
触发垃圾回收机制进行内存回收;
向所述监控终端发送发生内存泄漏的提示消息。
第三方面,本申请实施例提供一种网络设备,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一方面以及第一方面各种可能的实施方式所述的内存监控方法。
第四方面,本申请实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的实施方式所述的内存监控方法。
本申请实施例提供的内存监控方法、装置、设备及存储介质,在接收到针对应用程序中的监控对象的修改请求时,根据修改请求,对监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值,输出内存占用值,能够在修改监控对象的数据后,及时统计监控对象占用的内存,从而提高内存监控的实时性。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请一实施例提供的内存监控系统的架构示意图;
图2为本申请一实施例提供的内存监控方法的流程示意图;
图3为本申请又一实施例提供的内存监控方法的流程示意图;
图4为本申请另一实施例提供的内存监控方法的流程示意图;
图5为本申请一实施例提供的内存监控装置的结构示意图;
图6为本申请一实施例提供的网络设备的硬件结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本申请一实施例提供的内存监控系统的架构示意图。如图1所示,本实施例提供的内存监控系统包括用户终端11、服务器12和监控终端13。其中,用户终端11和监控终端13可以为手机、平板、台式电脑、笔记本电脑、车载终端等,在此不作限定。
本实施例提供的内存监控系统用于监控应用程序的对象所占用的内存。其中,应用程序可以为游戏、车票订购、社交等应用程序,在此不作限定。应用程序基于面向对象的语言开发,例如Python语言、Java语言、C#语言等。应用程序的对象为应用程序所采用的语言中定义的对象,具体在应用程序中可以体现为界面、特效、动画等。以游戏为例,游戏中的对象可以为玩家的人物角色、战斗的目标、血量、经验值、体力、背包、物品、非玩家角色(Non-Player Character,NPC)、场景、房子、建筑、动画、特效等。应用程序可以运行于用户终端11上,如在手机上下载安装应用程序;也可以运行于服务器中,如在服务器11中运行应用程序,在用户终端12上显示用户操作界面。
应用程序在用户终端11或服务器12上运行时,由于程序设计错误等原因,可能发生内存泄漏。内存泄漏是指应用程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成内存的浪费,会导致应用程序运行速度减慢甚至闪退。通常对应用程序的对象的内存占用进行监控,以便及时发现发生内存泄漏的对象。查找内存泄漏的对象有助于工作人员对应用程序进行更好的开发和运维。
在一种应用场景中,用户终端11上运行应用程序,用户终端11监控得到应用程序的对象的内存占用值,并通过服务器12发送给后台工作人员的监控终端13。在另一应用场景中,服务器12上运行应用程序,用户终端11显示用户操作界面,服务器12监控得到应用程序的对象的内存占用值,并发送给后台工作人员的监控终端13。监控终端13可以以图表、变化曲线等形式向工作人员显示应用程序的对象的内存变化,以便工作人员通过分析应用程序的对象的内存变化确定监控的对象是否发生内存泄漏。以游戏为例,监控对象可以为玩家设定的人物角色,监控终端上可以显示各人物角色的内存占用的变化曲线,工作人员通过变化曲线发现某人物角色的内存占用异常时,可以进一步获取该人物角色的血量、经验值、体力、背包等各属性的内存占用,进而找到发生内存泄漏的位置,后续可以对发生内存泄漏的位置的程序代码进行调整,以克服内存泄漏问题。
一般地,通过轮询方式来监控对象占用的内存变化。在需要监控应用程序的某个对象的内存变化时,通常会注册一个定时器,每隔一段间隔时间定时对该对象的内存占用大小进行统计。
然而,如果间隔时间设置的过短会导致轮询过于频繁,影响运行性能。如果间隔时间设置过长,会导致内存监控的实时性无法保障。通常为避免影响应用程序的运行性能,设置间隔时间较长,导致内存监控的实时性较差。
图2为本申请一实施例提供的内存监控方法的流程示意图。该内存监控方法的执行主体为网络设备,网络设备可以为上述的用户终端、服务器等,在此不作限定。如图2所示,该方法包括:
S201、在接收到针对应用程序中的监控对象的修改请求时,根据修改请求,对监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值。
S202、输出内存占用值。
本实施例中,监控对象为应用程序中被监控的对象。监控对象可以根据实际需求从应用程序的对象中选取,在此不作限定。以游戏为例,可以将玩家的人物角色、游戏场景中的建筑、NCP等作为监控对象。
针对应用程序中的监控对象的修改请求,可以是用户在使用应用程序时主动触发的,如监控对象为人物角色时,用户选择将该人物角色的某物品丢弃;也可以是应用程序运行过程中所产生的,如监控对象为人物角色时,该人物角色在参与战斗负伤时的血量减少。监控对象的数据可以包括监控对象的属性值,例如,监控对象为游戏中的人物角色时,监控对象的数据可以包括人物角色的血量、经验值、体力、背包、背包中的物品、物品的属性等。
本实施例中,网络设备在接收到针对应用程序中的监控对象的修改请求时,不仅根据修改请求对监控对象的数据进行修改,还在监控对象的数据修改后,对修改后的监控对象占用的内存进行统计,得到内存占用值。网络设备可以将内存占用值发送给监控终端,由监控终端显示给工作人员查看,也可以将内存占用值记录到相应的记录文件中,以便后续对该记录文件进行下载或查看,网络设备还可以根据实际需求对内存占用值进行其他的输出处理,在此不做限定。
本申请实施例在接收到针对应用程序中的监控对象的修改请求时,根据修改请求,对监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值,输出内存占用值,能够在修改监控对象的数据后,及时统计监控对象占用的内存,从而提高内存监控的实时性。
可选地,上述方法还可以包括:
根据内存占用值,确定监控对象是否发生内存泄漏;
若是,则执行以下中的至少一个步骤:
显示发生内存泄漏的提示消息;
触发垃圾回收机制进行内存回收;
向监控终端发送发生内存泄漏的提示消息。
本实施例中,网络设备监控得到内存占用值,可以根据内存占用值确定监控对象是否发生内存泄漏,例如可以根据预设阈值或预设判定策略对内存占用值进行处理,从而确定监控对象是否发生变化。在确定监控对象发生内存泄漏后,网络设备可以执行以下中的至少一个步骤:在用户终端上显示发生内存泄漏的提示消息,以便用户获知发生内存泄漏,及时保存用户数据,防止由应用程序闪退导致的用户数据丢失;自动触发用户终端或服务器的垃圾回收机制,进行内存回收,增加应用程序可用的内存,延后或避免应用程序的闪退;向监控终端发送发生内存泄漏的提示消息,以便工作人员得知发生内存泄漏的对象,进行相应的记录或处理。
可选地,S201中的对修改后的监控对象占用的内存进行统计,可以包括:
确定监控对象是否为可变数据类型;
若是,则遍历统计监控对象中各个属性的数据占用的内存之和作为监控对象的内存占用值。
本实施例中,应用程序基于Python语言开发。Python语言的标准库sys中的getsizeof函数,用于对对象的内存占用进行统计。一般地,通过调用getsizeof函数来统计监控对象的内存占用。但Python语言有两类数据类型:可变数据类型和不可变数据类型。可变数据类型包括list、dict、set等数据类型,不可变数据类型包括int、string、tuple等数据类型。对于不可变数据类型的对象,调用getsizeof函数可以准确统计出其内存占用值,但对于可变数据类型的对象,调用getsizeof函数统计出的内存占用值不准确。因此,现有的统计方法对不可变数据类型的对象难以进行统计。
本实施例中,网络设备对修改后的监控对象占用的内存进行统计时,首先确定监控对象是否为可变数据类型,若是,则遍历监控对象中各个属性的数据,对于每个数据分别调用getsizeof函数得到内存占用值,统计监控对象中各个属性的数据占用的内存之和作为监控对象的内存占用值。若网络设备确定出监控对象为不可变数据类型,则直接调用getsizeof函数统计监控对象的值。
本实施例通过类型判断,对可变数据类型和不可变数据类型分别采用不同的内存占用统计方式,以遍历方式能够准确确定出不可变数据类型的对象的内存占用值,提高内存占用统计的准确性。
可选地,上述方法还可以包括:
在监控对象存在子对象且子对象被监控时,若接收到针对应用程序中的监控对象的子对象的修改请求,则对子对象的数据进行修改,并对监控对象占用的内存进行统计。
本实施例中,若监控对象存在子对象,且子对象的内存占用也被监控,则在接收到针对应用程序中的监控对象的子对象的修改请求时,不仅对子对象的数据进行修改,也对监控对象占用的内存进行统计。对监控对象占用的内存进行统计,包括对子对象占用的内存的统计。以游戏为例,监控对象为玩家创建的人物角色,该监控对象的子对象可以为该人物角色的背包,背包的属性值为该子对象的属性值。在背包的数据进行修改后,则人物角色占用的内存也会发生变化,此时,需要对人物角色的内存占用进行统计,以便对人物角色的内存占用值及时进行更新。本实施例通过在接收到监控对象的子对象的修改请求,不仅对子对象的数据进行修改,还对监控对象占用的内存进行统计,能够及时更新监控对象的内存占用值,提高内存监控的实时性。
图3为本申请又一实施例提供的内存监控方法的流程示意图。本实施例对根据修改请求对修改后的监控对象占用的内存进行统计的具体实现过程进行了详细说明。如图3所示,该方法包括:
S301、在接收到针对应用程序中的监控对象的修改请求时,根据修改请求,确定目标修改方法函数。其中,监控对象中包括至少一个修改方法函数,每个修改方法函数对应于一个方法标识,修改请求中包括目标方法标识,修改请求用于请求调用目标方法标识对应的目标修改方法函数。
本实施例中,应用程序基于面向对象的语言开发,其中应用程序的对象中包括属性和方法函数,方法函数包括获取方法函数、修改方法函数等。对对象属性的修改可以通过调用对象中的修改方法函数实现。每个修改方法函数拥有一个方法标识,如可以为修改方法函数的函数名。通过一个方法标识,可以调用相应的修改方法函数。
以python语言为例,对于list数据类型的对象,对象中包含的修改方法函数可以包括:'insert'、'remove'、'append'、'extend'、'pop'、'reverse'等;对于dict数据类型的对象,对象中包含的修改方法函数可以包括:'update'、'pop'、'clear'等;对于set数据类型的对象,对象中包含的修改方法函数可以包括:'add'、'renove'、'pop'、'update'、'discard'、'clear'等。
网络设备接收到的修改请求中包含目标方法标识,该修改请求用于请求调用该目标方法标识对应的目标修改方法函数,以对监控对象进行修改。例如,修改请求中包含的目标方法标识为'add',则该修改请求用于请求调用'add'对应的'add'函数对监控数据进行修改。
S302、在预置的替换函数中,确定目标修改方法函数对应的替换函数,其中,监控对象的每个修改方法函数与每个替换函数之间一一对应,其中,替换函数用于对监控对象的数据进行修改、以及对修改后的监控对象占用的内存进行统计。
本实施例中,应用程序的代码中监控对象的每个修改方法函数对应于一个替换函数。监控对象的修改方法函数被调用时仅对监控对象的数据进行修改,而替换函数被调用时不仅对监控对象的数据进行修改,还会对修改后的监控对象占用的内存进行统计。
在一种可能的实现方式中,监控对象为基于python语言的对象,监控对象与描述符绑定,描述符中包括每个修改方法函数对应的替换函数。S302可以包括:
在描述符中确定目标修改方法函数对应的替换函数。
本实施例中,应用程序基于python语言开发,应用程序中的对象为基于python语言的对象。可以利用python语言中描述符的特性来设置替换函数。利用描述符绑定需要监控的对象,在描述符协议中,可以通过重写访问对象的方法实现对对象的监控。一旦对象中的某个修改方法函数被请求调用,则网络设备会自动调用描述符中该修改方法函数相应的替换函数,通过预先在替换函数中编写对监控对象数据进行修改,以及对修改后的监控对象占用的内存进行统计的代码,从而实现对监控对象的内存统计。例如,监控对象的修改方法函数为set,setitem,delitem,getattr,则描述符中预先设置的替换函数相应的可以为__set__,__setitem__,__delitem__,__getattr__。
本实施例对于基于python语言的对象,利用描述符能够重写访问对象的方法的特性来实现替换函数的调用,进而实现监控对象的内存占用监控,能够在不修改原应用程序中对象的方法函数的情况下,实现内存占用监控,易于实施,且代码简洁清晰,便于工作人员进行代码维护。
在另一种可能的实现方式中,可以预先建立替换函数与目标修改方法之间的对应关系,则S302可以包括:
通过上述对应关系,确定目标修改方法函数对应的替换函数。
本实施例中,网络设备在接收到修改请求后,可以通过查找对应关系确定目标修改方法函数对应的替换函数,能够方便快速的查找到相应的替换函数。
S303、调用目标修改方法函数对应的替换函数,以对监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值。
本实施例中,网络设备调用目标修改方法函数对应的替换函数,实现对监控对象的数据进行修改,以及对修改后的监控对象占用的内存统计,得到内存占用值。
S304、输出内存占用值。
本实施例中,S304与图2实施例中的S202类似,此处不再赘述。
本发明实施通过设置替换函数,在不对原有应用程序的对象中的修改方法函数代码调整的情况下,能够实现在接收修改请求后,既对监控对象的数据进行修改,又对修改后的监控对象占用的内存统计,使得应用程序所需调整的代码量大大减少,便于本方案的实施。
图4为本申请另一实施例提供的内存监控方法的流程示意图。本实施例对根据修改请求对监控对象的数据进行修改的具体实现过程进行了详细说明。如图4所示,该方法包括:
S401、在接收到针对应用程序中的监控对象的修改请求时,根据修改请求,对监控对象中目标属性标识对应的属性的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值。其中,监控对象中包括至少一个属性,每个属性对应于一个属性标识,修改请求中包括目标属性标识。
本实施例中,应用程序基于面向对象的语言开发,其中应用程序的对象中包括属性和方法函数,每个属性拥有一个属性标识,如可以为属性的属性名。在需要对一个对象的属性进行修改时,可以通过该属性的属性标识对其进行修改。
网络设备接收到修改请求后,将修改请求中的目标属性标识对应的属性确定为需要修改的属性,对其进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值。
S402、输出内存占用值。
本实施例中,S402与图2实施例中的S202类似,此处不再赘述。
可选地,上述方法还可以包括:
在接收到针对应用程序中的监控对象的获取请求时,其中,获取请求中包括目标属性标识,获取目标属性标识对应的属性的数据;
确定目标属性标识对应的属性的数据是否为不可变数据类型;
若是,则返回目标属性标识对应的属性的数据;
否则,将目标属性标识对应的属性的数据设置为新增的监控对象,并返回目标属性标识对应的属性的数据。
本实施例中,监控对象的属性数据在被获取请求调用后如果被修改,则监控对象的内存占用也会发生变化。例如,监控对象为游戏中的人物角色,网络设备接收到获取请求,来请求获取该人物角色的背包属性,该背包属性被获取后如果被修改,则该人物角色的内存占用也会发生变化。为避免属性被获取后修改的情况,本实施例中网络设备接收到针对应用程序中的监控对象的获取请求时,首先对目标属性标识对应的属性的数据进行判断,确定该数据是不可变数据类型还是可变数据类型,在该数据为不可变数据类型时,向该获取请求的请求方返回该数据。如果该数据是可变数据类型,则将该数据设置为新增的监控对象后,再向该获取请求的请求方返回该数据。
本实施例通过在获取可变数据类型的属性数据时,将该属性数据设置为监控对象再进行返回,这样在可变数据类型的属性数据被获取后,即使被修改,也能被本实施例提供的方法进行内存监控,从而提高内存监控的可靠性。
下面通过基于python语言的部分程序代码示例对上述的内存监控方法进行说明。为便于理解,在每段代码的下方用文字对代码进行解释说明。
1BASE_IHHUTABLE_TYPE=(int,str)#不可变数据类型:暂不考虑tuple,存盘不会存个不可变的tup1e数据
2BASE_HUTABLE_TYPE=(list,dict,set)#可变数据类型
代码行1-2,用于定义数据类型,将python的数据类型分为可变数据类型和不可变数据类型两类。
3 class Moni tor(object):
#实时监控值发生变化的类,支持int,str,list,dict,set类型值
4 LIST_MODIFY METHODS=['insert','remove','append',extend','pop','reverse']
5 DICT_HODIFY ME THODS=['update','pop','clear']
6 SET_MODIFY METHODS=['add','renove','pop','update','discard','clear']
代码行3-6,用于定义了一个Monitor属性监控类,并将list,dict,set中会改变数据的方法函数列出。
代码行7-12,用于定义初始化函数__init__,_init__函数里会对属性做一些初始化,包括实际值、监控对象(后文称为Monitor)在拥有者owner上的属性名、值发生修改时的回调函数(用于统计对象占用内存大小)、如果是内嵌数据(list,dict的value)则记录父监控对象、Monitor的拥有者。
代码行13-19,用于定义函数__get__,该函数作为描述符中的一个替换函数。当Monitor拥有者owner通过owner.attr_name方式获取Monitor的属性时,会调用Monitor类的__get__函数,先从owner.__dict__里获取属性数据,如果是不可变数据,则直接返回,否则将该数据创建为一个Monitor返回。
代码行20-26,用于定义函数__set__,该函数作为描述符中的一个替换函数。当Monitor的拥有者owner通过owner.attr_name=xxx方式设置属性时,会调用Monitor类的__set__函数,先设置owner.__dict__,然后调用回调函数进行占用内存统计。
代码行27-33,用于定义函数__getitem__,该函数作为描述符中的一个替换函数。当Monitor拥有者owner通过owner.attr_name[key]方式获取dict内容时,会调用Monitor类的__getitem__函数,先获取属性数据,如果是不可变数据则直接返回,否则生成新的Monitor对象返回,并设置父子关系,设置父子关系目的是子Monitor属性改变时能一层层通过父Monitor通知到owner。
代码行34-41,用于定义函数__setitem__,该函数作为描述符中的一个替换函数。当Monitor对象拥有者owner通过owner.attr_name[key]=xxx或者通过delowner.attr_name[key]方式修改和删除数据时,会分别调用Monitor的__setitem__和__delitem__函数,修改后会调用属性修改的回调函数进行内存占用统计。
代码行42-60,对于可变数据类型(list,dict,set)的Monitor对象,Monitor类重载了__getattr__方法,会修改数据内容的函数调用,在调用后都会通知回调函数进行内存统计。
代码行61-65,用于定义数据修改的回调函数on_value_changed()。如果有父Monitor则调用父Monitor的回调函数,否则直接调用回调函数统计内存。
代码行66-89,用于具体实现对可变数据类型和不可变数据类型的内存占用统计。该实现是基于getsizeof函数,但对于可变数据类型,设置不同的统计处理方法(71-76行)。其中对于dict数据类型的统计(74行),采用了自定义的dict_handler函数(69行),对于其他自定义的数据类型,可以根据实际需求设置不同的统计函数(类似75行所示)。
本实施例提供一套实时监控python对象发生变化,可定制化的能准确统计python各种数据类型占用内存大小的方法,具有以下优点:1、支持真正的实时统计,监控的python对象一旦发生变化,即可主动触发内存占用统计。2、更低的cpu开销,没有cpu定时轮询统计带来的额外性能开销。3、内存统计可定制化,能准确统计出各种类型的python对象内存占用大小。4、高通用性和良好的可移植性,和游戏逻辑无耦合,可非常便捷的接入任何python开发的游戏产品。
图5为本申请一实施例提供的内存监控装置的结构示意图。如图5所示,该内存监控装置50包括:处理模块501和输出模块502。
处理模块501,用于在接收到针对应用程序中的监控对象的修改请求时,根据修改请求,对监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值;
输出模块502,输出内存占用值。
可选地,监控对象中包括至少一个修改方法函数,每个修改方法函数对应于一个方法标识,修改请求中包括目标方法标识,修改请求用于请求调用目标方法标识对应的目标修改方法函数;
处理模块501,具体用于:
根据修改请求,确定目标修改方法函数;
在预置的替换函数中,确定目标修改方法函数对应的替换函数,其中,监控对象的每个修改方法函数与每个替换函数之间一一对应,其中,替换函数用于对监控对象的数据进行修改、以及对修改后的监控对象占用的内存进行统计;
调用目标修改方法函数对应的替换函数,以对监控对象的数据进行修改、并对修改后的监控对象占用的内存进行统计。
可选地,监控对象为基于python语言的对象,监控对象与描述符绑定,描述符中包括每个修改方法函数对应的替换函数;
处理模块501,具体用于:
在描述符中确定目标修改方法函数对应的替换函数。
可选地,监控对象中包括至少一个属性,每个属性对应于一个属性标识,修改请求中包括目标属性标识;
处理模块501,具体用于:
根据修改请求,对监控对象中目标属性标识对应的属性的数据进行修改。
可选地,处理模块501,还用于:
在接收到针对应用程序中的监控对象的获取请求时,其中,获取请求中包括目标属性标识,获取目标属性标识对应的属性的数据;
确定目标属性标识对应的属性的数据是否为不可变数据类型;
若是,则返回目标属性标识对应的属性的数据;
否则,将目标属性标识对应的属性的数据设置为新增的监控对象,并返回目标属性标识对应的属性的数据。
可选地,处理模块501,还用于:
在监控对象存在子对象且子对象被监控时,若接收到针对应用程序中的监控对象的子对象的修改请求,则对子对象的数据进行修改,并对监控对象占用的内存进行统计。
可选地,处理模块501,具体用于:
确定监控对象是否为可变数据类型;
若是,则遍历统计监控对象中各个属性的数据占用的内存之和作为监控对象的内存占用值。
可选地,处理模块501,还用于:
根据内存占用值,确定监控对象是否发生内存泄漏;
若是,则执行以下中的至少一个步骤:
显示发生内存泄漏的提示消息;
触发垃圾回收机制进行内存回收;
向监控终端发送发生内存泄漏的提示消息。
本申请实施例提供的内存监控装置,可用于执行上述的方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
图6为本申请一实施例提供的网络设备的硬件结构示意图。如图6所示,本实施例提供的网络设备60包括:至少一个处理器601和存储器602。该网络设备60还包括通信部件603。其中,处理器601、存储器602以及通信部件603通过总线604连接。
在具体实现过程中,至少一个处理器601执行存储器602存储的计算机执行指令,使得至少一个处理器601执行如上的内存监控方法。
处理器601的具体实现过程可参见上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
在上述的图6所示的实施例中,应理解,处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application SpecificIntegrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合申请所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器。
总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component Interconnect,PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。
本申请还提供一种计算机可读存储介质,该计算机可读存储介质中存储有计算机执行指令,当处理器执行该计算机执行指令时,实现如上的内存监控方法。
上述可读存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。可读存储介质可以是通用或专用计算机能够存取的任何可用介质。
一种示例性的可读存储介质耦合至处理器,从而使处理器能够从该可读存储介质读取信息,且可向该可读存储介质写入信息。当然,可读存储介质也可以是处理器的组成部分。处理器和可读存储介质可以位于专用集成电路(Application Specific IntegratedCircuits,简称:ASIC)中。当然,处理器和可读存储介质也可以作为分立组件存在于设备中。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (10)

1.一种内存监控方法,其特征在于,包括:
在接收到针对应用程序中的监控对象的修改请求时,根据所述修改请求,对所述监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值;
输出所述内存占用值;
所述监控对象中包括至少一个修改方法函数,每个修改方法函数对应于一个方法标识,所述修改请求中包括目标方法标识,所述修改请求用于请求调用所述目标方法标识对应的目标修改方法函数;
根据所述修改请求,对所述监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,包括:
根据所述修改请求,确定所述目标修改方法函数;
在预置的替换函数中,确定所述目标修改方法函数对应的替换函数,其中,所述监控对象的每个修改方法函数与每个替换函数之间一一对应,其中,替换函数用于对监控对象的数据进行修改、以及对修改后的监控对象占用的内存进行统计;
调用所述目标修改方法函数对应的替换函数,以对所述监控对象的数据进行修改、并对修改后的监控对象占用的内存进行统计;
所述监控对象为基于python语言的对象,所述监控对象与描述符绑定,所述描述符中包括每个修改方法函数对应的替换函数;
在预置的替换函数中,确定所述目标修改方法函数对应的替换函数,包括:
在所述描述符中确定所述目标修改方法函数对应的替换函数;
所述方法还包括:
在所述监控对象存在子对象且所述子对象被监控时,若接收到针对应用程序中的监控对象的子对象的修改请求,则对所述子对象的数据进行修改,并对所述监控对象占用的内存进行统计;
所述对修改后的监控对象占用的内存进行统计,得到内存占用值,包括:
确定所述监控对象是否为可变数据类型;
若是,则遍历统计所述监控对象中各个属性的数据占用的内存之和作为所述监控对象的内存占用值。
2.根据权利要求1所述的方法,其特征在于,所述监控对象中包括至少一个属性,每个属性对应于一个属性标识,所述修改请求中包括目标属性标识;
根据所述修改请求,对所述监控对象的数据进行修改,包括:
根据所述修改请求,对所述监控对象中所述目标属性标识对应的属性的数据进行修改。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
在接收到针对所述应用程序中的监控对象的获取请求时,其中,所述获取请求中包括所述目标属性标识,获取所述目标属性标识对应的属性的数据;
确定所述目标属性标识对应的属性的数据是否为不可变数据类型;
若是,则返回所述目标属性标识对应的属性的数据;
否则,将所述目标属性标识对应的属性的数据设置为新增的监控对象,并返回所述目标属性标识对应的属性的数据。
4.根据权利要求1-3任一项所述的方法,其特征在于,所述方法还包括:
根据所述内存占用值,确定所述监控对象是否发生内存泄漏;
若是,则执行以下中的至少一个步骤:
显示发生内存泄漏的提示消息;
触发垃圾回收机制进行内存回收;
向监控终端发送发生内存泄漏的提示消息。
5.一种内存监控装置,其特征在于,包括:
处理模块,用于在接收到针对应用程序中的监控对象的修改请求时,根据所述修改请求,对所述监控对象的数据进行修改,并对修改后的监控对象占用的内存进行统计,得到内存占用值;
输出模块,输出所述内存占用值;
所述监控对象中包括至少一个修改方法函数,每个修改方法函数对应于一个方法标识,所述修改请求中包括目标方法标识,所述修改请求用于请求调用所述目标方法标识对应的目标修改方法函数;
所述处理模块,具体用于:
根据所述修改请求,确定所述目标修改方法函数;
在预置的替换函数中,确定所述目标修改方法函数对应的替换函数,其中,所述监控对象的每个修改方法函数与每个替换函数之间一一对应,其中,替换函数用于对监控对象的数据进行修改、以及对修改后的监控对象占用的内存进行统计;
调用所述目标修改方法函数对应的替换函数,以对所述监控对象的数据进行修改、并对修改后的监控对象占用的内存进行统计;
所述监控对象为基于python语言的对象,所述监控对象与描述符绑定,所述描述符中包括每个修改方法函数对应的替换函数;
所述处理模块,具体用于:
在所述描述符中确定所述目标修改方法函数对应的替换函数;
所述处理模块,还用于:
在所述监控对象存在子对象且所述子对象被监控时,若接收到针对应用程序中的监控对象的子对象的修改请求,则对所述子对象的数据进行修改,并对所述监控对象占用的内存进行统计;
所述处理模块,在对修改后的监控对象占用的内存进行统计,得到内存占用值时,具体用于:
确定所述监控对象是否为可变数据类型;
若是,则遍历统计所述监控对象中各个属性的数据占用的内存之和作为所述监控对象的内存占用值。
6.根据权利要求5所述的装置,其特征在于,所述监控对象中包括至少一个属性,每个属性对应于一个属性标识,所述修改请求中包括目标属性标识;
所述处理模块,具体用于:
根据所述修改请求,对所述监控对象中所述目标属性标识对应的属性的数据进行修改。
7.根据权利要求6所述的装置,其特征在于,所述处理模块,还用于:
在接收到针对所述应用程序中的监控对象的获取请求时,其中,所述获取请求中包括所述目标属性标识,获取所述目标属性标识对应的属性的数据;
确定所述目标属性标识对应的属性的数据是否为不可变数据类型;
若是,则返回所述目标属性标识对应的属性的数据;
否则,将所述目标属性标识对应的属性的数据设置为新增的监控对象,并返回所述目标属性标识对应的属性的数据。
8.根据权利要求5-7任一项所述的装置,其特征在于,所述处理模块,还用于:
根据所述内存占用值,确定所述监控对象是否发生内存泄漏;
若是,则执行以下中的至少一个步骤:
显示发生内存泄漏的提示消息;
触发垃圾回收机制进行内存回收;
向监控终端发送发生内存泄漏的提示消息。
9.一种网络设备,其特征在于,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如权利要求1-4任一项所述的内存监控方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1-4任一项所述的内存监控方法。
CN202010272600.9A 2020-04-09 2020-04-09 内存监控方法、装置、设备及存储介质 Active CN111488256B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010272600.9A CN111488256B (zh) 2020-04-09 2020-04-09 内存监控方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010272600.9A CN111488256B (zh) 2020-04-09 2020-04-09 内存监控方法、装置、设备及存储介质

Publications (2)

Publication Number Publication Date
CN111488256A CN111488256A (zh) 2020-08-04
CN111488256B true CN111488256B (zh) 2024-04-09

Family

ID=71798181

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010272600.9A Active CN111488256B (zh) 2020-04-09 2020-04-09 内存监控方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN111488256B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113791950B (zh) * 2021-09-15 2024-09-03 北京金山云网络技术有限公司 一种服务程序的信息处理方法、装置、服务器及存储介质
CN114546590B (zh) * 2022-02-18 2023-03-14 北京基调网络股份有限公司 Java虚拟机堆内存集合对象监测方法及内存溢出分析方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109857615A (zh) * 2018-12-29 2019-06-07 北京奇安信科技有限公司 一种内存泄漏的检测方法及装置
CN110389860A (zh) * 2019-06-20 2019-10-29 北京奇艺世纪科技有限公司 一种数据处理方法、装置、电子设备及存储介质

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109857615A (zh) * 2018-12-29 2019-06-07 北京奇安信科技有限公司 一种内存泄漏的检测方法及装置
CN110389860A (zh) * 2019-06-20 2019-10-29 北京奇艺世纪科技有限公司 一种数据处理方法、装置、电子设备及存储介质

Also Published As

Publication number Publication date
CN111488256A (zh) 2020-08-04

Similar Documents

Publication Publication Date Title
CN109104336B (zh) 服务请求处理方法、装置、计算机设备及存储介质
US20070005926A1 (en) Method for managing a memory in mobile terminal
CN111488256B (zh) 内存监控方法、装置、设备及存储介质
US20030149743A1 (en) Data logging for resident applications within portable electronic devices
CN111159436A (zh) 一种推荐多媒体内容的方法、装置及计算设备
US9104567B2 (en) Memory-leak identification
CN109408265B (zh) 一种ios运行异常的保护方法、装置、终端设备及存储介质
CN114422439A (zh) 接口限流方法、装置、计算机设备和存储介质
CN109032693B (zh) 一种加载展示信息方法、装置、电子设备及可读存储介质
CN114697440B (zh) 网络管理方法及移动终端
CN111597041A (zh) 一种分布式系统的调用方法、装置、终端设备及服务器
CN111124627A (zh) 应用程序的调起者确定方法、装置、终端及存储介质
WO2022183929A1 (zh) 读取通讯录的方法、装置、系统及计算机可读存储介质
CN112631949B (zh) 一种调试方法、装置、计算机设备及存储介质
CN116010499A (zh) 一种确定解析规则的方法、装置及电子设备
CN113535832B (zh) 云服务数据的获取方法、装置、电子设备及介质
CN116560809A (zh) 数据处理方法及装置、设备、介质
CN108846141B (zh) 一种离线缓存加载方法及装置
CN113672248A (zh) 一种补丁获取方法、装置、服务端及存储介质
CN112052054A (zh) 函数调用方法、装置、电子设备及存储介质
CN113760325A (zh) 容器环境更新方法及装置
WO2014173129A1 (en) Mobile terminal flow identification method and apparatus
US11586528B2 (en) Software development kit with independent automatic crash detection
CN112988592B (zh) 代码检测方法、装置、设备和存储介质
CN114500444B (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