CN111858339A - 内存分析方法、设备和系统以及计算设备、计算机可读存储介质 - Google Patents

内存分析方法、设备和系统以及计算设备、计算机可读存储介质 Download PDF

Info

Publication number
CN111858339A
CN111858339A CN202010712594.4A CN202010712594A CN111858339A CN 111858339 A CN111858339 A CN 111858339A CN 202010712594 A CN202010712594 A CN 202010712594A CN 111858339 A CN111858339 A CN 111858339A
Authority
CN
China
Prior art keywords
class
memory
objects
static
information
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
CN202010712594.4A
Other languages
English (en)
Other versions
CN111858339B (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.)
Tencent Technology Chengdu Co Ltd
Original Assignee
Tencent Technology Chengdu 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 Chengdu Co Ltd filed Critical Tencent Technology Chengdu Co Ltd
Priority to CN202010712594.4A priority Critical patent/CN111858339B/zh
Publication of CN111858339A publication Critical patent/CN111858339A/zh
Application granted granted Critical
Publication of CN111858339B publication Critical patent/CN111858339B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

公开了一种内存分析方法、设备和系统,以及一种计算设备和计算机可读存储介质。该内存分析方法包括:接收针对目标应用的内存分析请求;响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;根据第一类对象的第一引用关系信息,获取内存中的第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。

Description

内存分析方法、设备和系统以及计算设备、计算机可读存储 介质
技术领域
本发明涉及计算机领域,更具体地涉及一种内存分析方法、设备和系统,以及一种计算设备和计算机可读存储介质。
背景技术
随着诸如智能手机和平板电脑之类的移动终端设备的普及,手机类应用和游戏得到快速发展。在手机应用或游戏的开发过程中,优化手机应用或游戏在运行时占用的内存、降低内存占用率受到手机应用开发人员的关注。因为,若游戏运行过程中占用内存过多,可能会被操作系统认定为异常进程而直接关闭,也可能会因占用过多导致系统内存,使得系统性能降低,从而令游戏体验下降。
然而,在当前的手机引用和游戏开发和测试过程中,以Unity应用和游戏开发引擎结合Mono编译工具平台为例,由于无法获取到Mono托管的内存堆中详细的对象和内存使用情况,因此想要优化Mono内存是十分困难的,往往只能通过开发的经验来尝试性优化。同时,随着手机游戏应用程序的复杂程度不断提高,其开发过程中不可避免地出现内存泄露的情况。对于Mono的内存泄漏等问题,相关技术无法得知内存泄漏的本质原因。
发明内容
本发明的目的是克服相关技术的缺陷中至少一种。
根据本发明的一个方面,提供了一种内存分析方法,包括:接收针对目标应用的内存分析请求;响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;根据第一类对象的第一引用关系信息,获取内存中的第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。
在一些实施例中,第一类对象的第一引用关系信息包括第一类对象中各对象的名称和各对象之间的引用路径;第二类对象中的静态对象包括静态变量和静态类。
在一些实施例中,第二类对象中静态对象的第二引用关系信息包括该静态对象的元信息、该静态对象直接和/或间接引用的对象的元信息、引用路径。
在一些实施例中,静态对象的元信息包括:该静态对象的名称、类型、字段、对象值和内存占用的大小中至少一个,所述静态对象直接和间接引用的对象的元信息包括所述静态对象直接和/或间接引用的对象的名称、类型、字段、对象值和内存占用的大小中至少一个。
在一些实施例中,查找编译工具程序域中的静态类集合,以获取静态类集合中每一个静态类的元信息;基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,其中每一个静态类的引用链为树状结构,根节点为该静态类,其余各节点都是其父节点的直接引用对象,叶节点为没有直接引用对象的对象;根据所述静态类集合中每一个静态类的引用链,确定第二类对象中的静态对象的第二引用关系信息;其中,所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,包括:在递归查找直接引用对象的过程中,判断当前查找到的直接引用对象是否属于第二类对象;响应于当前查找到的直接引用对象不属于第二类对象,通过自定义接口从目标应用的引擎访问第一类对象的第一引用关系信息以实现针对所述当前查找到的直接引用对象的后续递归查找。
在一些实施例中,所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链包括:初始化步骤:将每一个静态类作为引用链的根节点并设定为当前对象;直接引用关系判断步骤:根据当前对象的元信息,判断当前对象是否存在直接引用对象;引用链节点确定步骤:响应于当前对象存在直接引用对象,获取该直接引用对象的元信息并将该直接引用对象作为当前对象的子节点;递归循环步骤:在获取所述直接引用对象元信息之后,将所述直接引用对象作为当前对象,转到直接引用关系判断步骤;循环结束步骤:响应于当前对象不存在直接引用对象,结束引用链获取。
在一些实施例中,引用链节点确定步骤包括:根据当前对象的元信息,确定当前对象中成员变量的类型;响应于当前对象的成员变量为数组类型变量,则从内存中存储的该数组的首地址所指向的元素开始,依序遍历该数组的每个元素,从而获得每个元素所引用的对象的元信息,作为直接引用对象的元信息;响应于当前对象的成员变量为字符串类型变量,则根据内存中存储的该字符串的首地址所指向的字符串对象,来获取该字符串对象的元信息,作为直接引用对象的元信息;响应于当前对象的成员变量为类类型变量,则根据内存中存储的该类类型变量所指向的类对象的首地址,依序遍历该类对象中的每个成员变量,从而获得该类对象的元信息,作为直接引用对象的元信息。
在一些实施例中,根据本发明的内存分析方法进一步包括:根据第一类对象的第一引用关系信息和第二类对象中静态对象的第二引用关系信息,生成目标应用的第二内存快照文件。
在一些实施例中,根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件,包括:将第二类对象中静态对象的第二引用关系信息序列化,以形成目标应用的第一内存快照文件。
在一些实施例中,根据本发明的内存分析方法进一步包括:将第一内存快照文件发送至服务器以供服务器通过反序列化解析还原并展示第二类对象中静态对象的第二引用关系信息。
在一些实施例中,应用引擎包括Unity引擎,所述编译工具包括Mono。
根据本发明的另一方面,提供另一种内存分析方法,包括:接收针对目标应用的内存分析请求;响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;根据第一类对象的第一引用关系信息,获取内存中的第二类对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;根据第二类对象的第二引用关系信息,生成目标应用的第三内存快照文件。
在根据本发明的另一种内存分析方法中,第二类对象的第二引用关系信息包括第二类对象中每一个对象的元信息、以及其直接引用的第二类对象或第一类对象中对象的元信息。
根据本发明的又一个方面,提供一种内存分析设备,包括:接收模块,其配置成接收针对目标应用的内存分析请求;第一获取模块,其配置成响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;第二获取模块,其配置成根据第一类对象的第一引用关系信息,获取内存中第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;生成模块,其配置成根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。
根据本发明的另一方面,提供一种内存分析系统,包括内存分析设备和内存分析服务器,其中内存分析设备包括:第一接收模块,其配置成从内存分析服务器接收针对目标应用的内存分析请求;第一获取模块,其配置成响应于目标应用的分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;第二获取模块,其配置成根据第一类对象的第一引用关系信息,获取内存中第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;快照生成模块,其配置成根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件;第一发送模块,其配置成将第一内存快照文件发送至内存分析服务器,
内存分析服务器包括:第二发送模块,其配置成向内存分析设备发送针对目标应用的内存分析请求;第二接收模块,其配置成从内存分析设备接收第一内存快照文件;快照解析模块,其配置成从第一内存快照文件中解析出第二类对象中静态对象的第二引用关系信息;快照展示模块,其配置成展示第二类对象中静态对象的第二引用关系信息。
根据本发明的另一方面,提供一种计算设备,包括:处理器;以及存储器,其上存储有指令,所述指令当在所述处理器上执行时促使所述处理器执行根据本发明一些实施例的内存分析方法。
根据本发明的另一方面,提供一种或多种计算机可读存储介质,其上存储有计算机可读指令,所述计算机可读指令在被执行时实现根据本发明一些实施例的内存分析方法。
本发明所公开的内存分析方法能够对应用程序运行中静态变量所占用的内存的情况及其引用关系进行全面的展示,发明使用人通过分析静态变量的占用大小可以考量优化内存的策略,通过分析待释放静态变量的引用关系,可以确定释放该内存所需要调整的引用关系,从而实现优化内存的策略。
附图说明
根据以下详细描述和附图,将容易理解本发明的各个不同的方面、特征和优点,在附图中:
图1示意性示出根据本发明一些实施例的内存分析方法的示例应用环境;
图2示意性示出根据本发明一些实施例的内存分析方法在图1的示例应用环境中的示例交互图;
图3A示意性示出根据本发明一些实施例的内存分析方法的流程图;
图3B示意性示出根据本发明一些实施例的内存分析方法所得到的第一内存快照文件的示例展示界面;
图3C示意性示出根据本发明一些实施例的内存分析方法的流程图;
图4示意性示出根据本发明一些实施例的内存分析方法的流程图;
图5示意性示出根据本发明一些实施例的内存分析方法的流程图;
图6示意性示出根据本发明一些实施例的内存分析方法的流程图;
图7示意性示出Mono对象的内存结构图;
图8A示意性示出根据本发明一些实施例的内存分析方法中内存对象引用关系的分析逻辑图;
图8B示意性示出根据本发明一些实施例的内存分析方法的流程图;
图9示意性示出根据本发明一些实施例的内存分析方法的流程图;
图10示意性示出根据本发明一些实施例的内存分析设备的结构框图;
图11A示意性示出根据本发明一些实施例的内存分析系统的结构框图;
图11B示意性示出由图11A的内存分析系统所得的内存快照文件的示例展示界面。
图12示意性示出根据本发明一些实施例的计算设备。
应当指出,上述附图仅仅是示意性的和说明性的,且并不一定按照比例绘制。
具体实施方式
下面将参照附图更详细地描述本发明的若干个实施例以便使得本领域技术人员能够实现本发明。然而,本发明可以体现为许多不同的形式并且不应被解释为局限于本文所阐述的实施例。相反,提供这些实施例以使得本发明全面且完整,并将充分地向本领域技术人员传达本发明的范围。所述实施例并不限定本发明。
将理解的是,尽管术语第一、第二、第三等在本文中可以用来描述各种元件、部件和/或部分,但是这些元件、部件和/或部分不应当由这些术语限制。这些术语仅用来将一个元件、部件或部分与另一个元件、部件或部分相区分。因此,下面讨论的第一元件、部件或部分可以被称为第二元件、部件或部分而不偏离本发明的教导。
本文中使用的术语仅出于描述特定实施例的目的并且不意图限制本发明。如本文中使用的,单数形式“一个”、“一”和“该”意图也包括复数形式,除非上下文清楚地另有指示。将进一步理解的是,术语“包括”和/或“包含”当在本说明书中使用时指定所述及特征、整体、步骤、操作、元件和/或部件的存在,但不排除一个或多个其他特征、整体、步骤、操作、元件、部件和/或其群组的存在或添加一个或多个其他特征、整体、步骤、操作、元件、部件和/或其群组。如本文中使用的,术语“和/或”包括相关联的列出项目中的一个或多个的任意和全部组合。
除非另有定义,本文中使用的所有术语(包括技术术语和科学术语)具有与本发明所属领域的普通技术人员所通常理解的相同含义。将进一步理解的是,诸如那些在通常使用的字典中定义的之类的术语应当被解释为具有与其在相关领域和/或本说明书上下文中的含义相一致的含义,并且将不在理想化或过于正式的意义上进行解释,除非本文中明确地如此定义。
对利用Unity引擎开发且用Mono编译运行的应用或游戏,相关技术的内存分析和测试方案中,由于Mono是申请一块大内存自己管理,因此只能获取到整个Mono堆的大小,无法得知里面内存的具体使用情况和对象内容。由于无法获取到Mono堆中详细的对象和内存使用情况,因此就无法通过针对性地删减某些静态变量,从而减少内存占用,因此想要优化Mono的内存是十分困难的,往往只能通过开发的经验来尝试性优化。同时,对于内存泄漏问题分析,相关技术中的unity memory profiler只能在使用IL2Cpp编译的游戏上使用,但针对使用Mono编译的游戏,没有Mono内存泄漏分析功能。
为解决上述问题中至少一个,本发明提供的内存分析方法聚焦于Mono内存中使用的静态对象和被静态对象引用的对象,从而实现内存泄漏源头的精准定位。在根据本发明的内存分析方法中,主要针对以基于跨平台的游戏引擎(如Unity)开发且通过基于通用语言架构的编译工具(如Mono)编译运行的应用或游戏,进行内存分析或检测。在下文中,一般地,将以Unity作为应用或戏引擎的示例、Mono作为编译工具的示例,进行说明。对于其余类型的游戏引擎和/或其余类型的编译工具,与此类似,不再赘述。
在详细介绍本发明的实施例之前,为了清楚起见,首先对一些相关的概念进行解释:
1、Unity:一个可以用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。
2、Mono:一套匹配ECMA(European Computer Manufactures Association,即欧洲计算机制造联合会)标准(Ecma-334和Ecma-335)的.NET工具,包括C#编译器和通用语言架构。
3、对象:指应用或游戏运行过程中,在其对应的内存中装载的程序集内部的实例,例如面向对象的程序设计语言C++、C#、Java中的类对象,其中,类是对一群有共同特征的事物或事件的集合,而类对象就是类的实例化。对象可以包括各种实例化的变量,例如值类型变量(如int、float、struct等)以及引用类型变量(类类型、数组型、字符串型等),另外还可以包括占用内存的其他实例,如静态类。
4、第一类对象和第二类对象,第一类对象为在应用或游戏运行过程中,应用或游戏引擎中使用的占用了内存的原生(Native)对象(或称为引擎对象)的集合;第二类对象为在编译工具应用程序域中的占用了内存的对象的集合。在本文中,第一类对象也可以被示例性的表示为Unity对象,第二类对象可以被示例性地表示为Mono对象。
5. 对象的元信息:是指描述对象属性的信息,例如可以包括对象名称、对象类型、对象值、内存值,对象所属类的成员数据等等。
图1示意性示出了根据本发明一些实施例的内存分析方法的示例应用场景。如图1所示,应用场景100可以包括终端设备110和服务器120以及用于连接终端设备110和服务器120的网络130。在一些实施例中,终端设备110可以用于实现根据本发明的内存分析方法,例如该终端设备110可以部署有用于执行本发明提供的各种方法的相应程序或指令。可选地,服务器120也可以用于实现根据本发明的各种方法。在一些实施例中,应用场景100也可以被认为对应于图11所示的用于实现根据本发明一些实施例的内存分析方法的内存分析系统1100,请参见图11及其相应描述。
在一些实施例中,待分析或测试的应用(即目标应用)运行在诸如手机之类的终端设备110上,通过终端设备110获取并分析该目标应用的内存对象,随后根据分析结果得到内存分析数据,最后根据内存分析数据生成内存快照文件。在终端设备110开始分析目标应用的内存对象之前,通常需要终端设备110从服务器120接收一个用于触发内存分析动作的信号,即针对目标应用的内存分析请求或命令。可选地,上述触发信号或内存分析请求也可以由终端设备110自主触发或者由终端设备110的用户通过人机交互接口手动触发。在一些实施例中,终端设备110在生成内存快照文件之后,将通过网络130将其发送给服务器120,最后由服务器对内存快照文件进行解析和展示,以便软件或游戏开发或测试人员可以在服务器120上通过诸如显示器之类的输出设备查询、浏览内存快照文件中所存储的内存分析数据。
终端设备110可以是任何类型的移动计算设备,包括移动计算机(例如,Microsoft® Surface®设备、个人数字助理(PDA)、膝上型计算机、笔记本计算机、诸如Apple iPadTM的平板计算机、上网本等)、移动电话(例如,蜂窝电话、诸如Microsoft Windows®电话的智能手机、Apple iPhone、实现了Google® AndroidTM操作系统的电话、Palm®设备,Blackberry®设备等)、可穿戴式计算设备(例如智能手表、头戴式设备,包括智能眼镜,如Google® GlassTM,等)或其他类型的移动设备。在一些实施例中,终端设备110也可以是固定式计算设备,例如台式计算机、游戏机、智能电视等。
服务器120可以是单个服务器或服务器集群或云服务器集群。应理解,本文所提及的服务器典型地为具有大量存储器和处理器资源的服务器计算机,但是其他实施例也是可能的。可选地,如图1所示,服务器120也可以是普通的台式计算机,其包括主机、显示器等。
网络130的示例包括局域网(LAN)、广域网(WAN)、个域网(PAN)、和/或诸如因特网之类的通信网络的组合。服务器120以及终端设备110可以包括能够通过网络130进行通信的至少一个通信接口(未示出)。这样的通信接口可以是下列各项中的一个或多个:任何类型的网络接口(例如,网络接口卡(NIC))、有线或无线(诸如IEEE 802.11无线LAN(WLAN))无线接口、全球微波接入互操作(Wi-MAX)接口、以太网接口、通用串行总线(USB)接口、蜂窝网络接口、BluetoothTM接口、近场通信(NFC)接口等。通信接口的另外的示例在本文其他地方描述。
图2示出了图1所示的根据本发明一些实施例的内存分析方法的示例应用场景100的示例交互图。下面参考图2所示的示例交互图简要描述根据本发明一些实施例的内存分析方法在示例场景100中的工作原理。
在图2所示的应用场景100中,首先,终端设备110被配置成:从服务器120接收针对目标应用的内存分析请求或命令,该请求或命令中通常包含内存分析所针对的目标应用的标识。其次,终端设备110被配置成:响应于内存分析请求,启动目标应用,并在目标应用运行时获取第一类对象(例如Unity对象)的第一引用关系信息;根据第一类对象的第一引用关系信息,获取第二类对象中静态对象(例如Mono对象)的第二引用关系信息;以及根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件;最后将第一内存快照文件发送至服务器120以供其解析和展示。
在图2所示的应用场景100中,服务器120可以被配置成:首先向终端设备110发送针对目标应用的内存分析请求,以触发终端设备110启动目标应用并进行应用运行时的内存分析;其次,从终端设备110接收所生成的第一内存快照文件;最后,将第一内存快照文件解析并展示,以供用户(如游戏开发或测试人员)浏览和查询。
图1和图2的示例环境和工作流程仅仅是示意性的,根据本发明的内存分析方法并不限于所示出的示例环境。应理解,虽然在本文中,服务器120与终端设备110被示出和描述为分离的结构,但它们也可以是同一计算设备的不同组成部分。例如,可选地,根据本发明一些实施例的内存分析方法的应用场景或实施环境也可以仅包括终端设备而不涉及服务器,即终端设备在目标应用运行过程中自主完成内存分析触发、对象获取、快照生成、解析展示的整个过程。
图3A示意性示出了根据本发明一些实施例的内存分析方法的流程图。
在一些实施例中,该内存分析方法可以在终端设备上(例如,图1和图2所示的终端设备110)执行。在另一些实施例中,该内存分析方法也可以由图1和图2所示的服务器120和终端设备110相组合地执行。
在步骤S310处,接收针对目标应用的内存分析请求。
在该步骤中,目标应用是指内存分析或检测的目标,即待分析或检测的应用或游戏。如图2所示,内存分析请求可以是由服务器120发出的用于指示终端设备110进行内存分析或检测的命令或信号,即用于触发终端设备110开始针对目标应用的内存分析动作的触发信号。内存分析请求中通常包括待分析的目标应用的标识,用以告知终端设备110内存分析所针对的应用或游戏。可选地,上述触发信号或内存分析请求也可以由终端设备110自主触发或者由终端设备110的用户通过人机交互接口手动触发。
该目标应用可以是基于跨平台的应用或游戏引擎(例如Unity)开发的Windows(Windows操作系统)、MacOS(苹果操作系统)、Linux平台(Linux操作系统)的计算机应用或游戏,或是ios(苹果系统)、Android(安卓系统)移动设备的应用或游戏。在一些实施例中,根据诸如Unity的跨平台引擎开发的目标应用可以采用例如Mono之类的支持通用语言架构的跨平台编译工具进行编译。
在步骤S320处,响应于内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的引擎对象的集合。
在该步骤中,内存分析请求中的“内存”指目标应用运行时为该目标应用分配的内存。目标应用运行时内存中的对象,指该应用程序运行过程中,在其对应的内存中装载的程序集内部的实例,例如面向对象的程序设计语言C++、C#、Java中的类对象。以C#为例,对象可以包括各种实例化的变量,例如值类型变量(如int、float、struct等)以及引用类型变量(类类型、数组型、字符串型等),另外还可以包括静态类。
在利用跨平台游戏引擎(如Unity)开发且利用跨平台编译工具(如Mono)编译运行的目标应用中,内存中的对象可以包括两大类,即第一类对象和第二类对象,第一类对象为应用或游戏的引擎侧中使用的占用了内存(例如引擎Native堆内存)的原生对象的集合;第二类对象为在编译工具应用程序域中的占用了内存(例如Mono托管堆内存)的对象的集合。以Unity引擎开发并采用Mono作为编译工具的应用和游戏为例,其运行时内存可以包含Mono托管堆(Managed Heap)和Unity原生堆(Native Heap)。前者中的对象为第二类对象,后者中的对象为第一类对象。显然,第二类对象包括Mono应用程序域(C#代码)中的对象(如实例化变量),第一类对象包括Unity脚本引擎(C++代码)中的对象(例如贴图,音效,场景之类的资源对象等)。
如步骤S320所示,在根据本发明一些实施例的内存分析方法中,在接收到内存分析请求之后,首先需要获取第一类对象中所有对象的第一引用关系信息,因为后面关于第二类对象的分析,需要用到第一类对象,即Mono对象的分析与Unity对象内存分析相关联。第一引用关系信息是指第一类对象中各个对象的直接和间接引用关系的相关信息,例如包括第一类对象中各个对象的名称和各对象之间的引用路径。第一类对象中各个对象之间的引用路径是指各个对象通过直接和/或间接引用关系建立的相互连通的路径。例如第一类对象包括A、B、C三个对象,其中A引用C、C引用B,则第一引用关系信息可以包括A、B、C各自的对象名称以及各个对象的引用路径,即A-C-B。
可选地,第一引用关系信息还可以包括第一类对象中各个对象的元信息。该元信息可以包括对象的名称(Name)、类型(Class)(如类对象的类名)、字段(Field)、对象值(Value)(如其所引用的对象的首地址)和内存占用的大小或内存值 (Size)中至少一个。关于第一类对象的第一引用关系信息的获取,可以利用相关技术完成。例如利用Unitymemory profiler直接获取Unity引擎中的对象的包括引用关系在内的内存相关信息。
在步骤S330处,根据第一类对象的第一引用关系信息,获取内存中的第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合。
在该步骤中,第二类对象中的静态对象包括编译工具程序域中的所有静态数据,例如静态类和静态变量。例如,静态对象可以是面向对象的程序设计语言中用static修饰的类和变量,其中静态变量可以包括各种类型,如引用型(类对象、数组对象、字符串对象等)或值类型(结构体对象、简单值类型对象等)。由于应用或游戏中大部分内存泄漏问题都是由于第二类对象中的静态对象的引用造成的,如Mono静态对象及其引用往往是Unity引擎开发的游戏运行时内存泄漏的根源,因此,对第二类对象的分析可以集中于其静态对象及其引用关系的分析。
在该步骤中,第二类对象中静态对象的引用关系可以包括该静态对象的直接引用关系和/或间接引用关系,或该静态对象的直接和间接引用形成的引用链或引用树。第二类对象中静态对象的第二引用关系信息是指该静态对象的直接和/或间接引用关系或引用链相关信息,例如可以包括该静态对象的元信息、其直接或间接引用的第一类或第二类对象的元信息、以及该静态对象的直接和/或间接引用关系所涉及的引用路径信息。例如,假设D为第二类对象中的一个静态对象,其直接和间接引用关系为:D引用E和F,E引用G和H,其中G和H为第一类对象,其余为第二类对象,则该静态对象D的第二引用关系信息可以包括D、E、F、G、H各自的元信息,以及上述引用关系的引用路径:D-E-G、D-E-H、D-F。
对象的元信息可以下述中的一个或多个:对象的名称(Name)、类型(Class)(如类对象的类名)、字段(Field)、对象值(Value)(如其所引用的对象的首地址)和内存占用的大小或内存值 (Size)。可选地,本文所述的引用关系也可以为双向引用关系,比如静态对象的引用关系可以包括该静态对象引用其他对象,以及该静态对象被其他对象引用。
如上文所述,第二类对象的分析与第一类对象的第一引用关系信息相关联,这是因为目标应用运行过程中,引擎(如Unity)对象(即第一类对象)和编译工具(如Mono)对象(即第二类对象)有可能存在相互引用的情况。因此,在分析第二类对象的过程中,即获取第二类对象中的静态对象的引用关系过程中,可以通过引擎层提供的接口访问引擎中的对象(即第一类对象)的元信息和引用关系。
关于第二类对象中静态对象的具体获取方法,可以利用编译工具(如Mono)内存对象管理机制来获取第二类对象中的静态对象并递归查找其引用的对象,从而获得静态对象的引用关系或引用链。具体请参见图4。
在步骤S340处,根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。
在得到第二对象的静态对象的第二引用关系信息之后,需要对第二引用关系信息进行进一步处理来形成内存快照文件。例如可以通过序列化将第二对象中静态对象的应用关系数据转存为第一内存快照文件,以利于文件传输。如图2所示,序列化之后的第一内存快照文件可以将被发送至服务器以进行解析和展示,其中解析步骤是通过反序列化还原第二类对象中静态对象的第二引用关系信息的过程。
当两个游戏进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把各个对象的状态信息转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象的状态信息。序列化就是将对象的状态信息转换为可以存储或传输的形式的过程。序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将对象的状态信息分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象的状态信息。对象序列化不仅保存一个对象的数据,而且递归保存对象引用的每个对象的数据。序列化过程可以将全部对象层次写入字节流中,并可以保存在文件中或在网络连接上传递。
可选地,也可以不进行诸如序列化之类的数据转换,而直接从所得到的静态对象引用关系数据生成第一内存快照文件,尽管这可能需要为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。
图3B示出根据本发明一些实施例的内存分析方法所得到的内存快照文件的示例展示界面。
如图3B所示,根据本发明一些实施例的内存分析方法可以获取到内存对象(包括第一类对象和第二类对象)的引用关系信息,尤其是第二类对象中的静态对象的递归引用链,其中引用关系可以包括各个对象的正向和逆向引用关系。如图3B所示,在展示界面中,内存分析方法可以将收集到的处于静态类根节点引用链中的各个节点(即Mono对象)的元信息,包括节点的名称(Name)、引用类型字段(Field)、内存占用大小或内存值(Size)、索引(Index)、对象值(value)、struct类型字段(Array Count)以及该Mono对象所对应的引擎侧对象(Unity Data)。作为一个示例,名称为[0x0000017fc471b]的Mono变量的索引为16794,其类型为UnityEngine.gui,对象值为Positive References,通过点击操作可以查看其具体值,意味着该对象是另一对象的引用对象,其值为所引用对象的地址,内存占用大小为48比特,引用类型字段为3,意味着该Mono对象的字段包含三个子字段(Field);struct类型字段无数值,意味着该对象不属于struct类型,无成员变量;Unity Data字段无数值,意味着该Mono对象未引用引擎侧对象。
在该界面弹出的衍生界面(即右下方界面)中,展示了一个静态类根节点([0x0000017fc3601])下的引用相关信息,该节点下方各个变量均与该根节点存在直接或间接的引用关系,其他字段与上述字段含义相同。
根据图3B所示,在根据本发明一些实施例的内存分析方法中,聚焦于编译工具侧内存(如Mono内存)中对象(第二类对象)的静态数据或静态对象(如静态变量和静态类),并且结合引擎侧(如Unity)内存对象(第一类对象)的第一引用关系信息,利用递归查找方法获取到第二类对象中所有在静态变量及其引用关系,从而得到其引用关系(直接和/或间接引用关系),即引用链上的(即直接或间接引用的)对象。这样,通过第二类对象中静态对象的引用链可以轻松查看哪些静态变量引用了过大的对象导致例如Mono托管内存占用过高,为编译工具托管内存优化提供具体方向;而且,通过静态变量的引用链,可以针对性分析内存泄漏问题,从而能够帮助游戏开发和测试快速定位游戏中关于Mono的内存泄露问题,例如第一类对象(如资源对象)被不正确的第二类对象中静态变量引用而导致无法释放的问题;以及,通过将第二类Mono对象和第一类Unity原生对象关联起来,可以了解编译工具托管内存堆(Mono堆)中的哪些对象是引擎侧使用的,简化内存分析。
图3C示出根据本发明一些实施例的内存分析方法。如图3C所示,除了图3A所示的步骤S310-S340之外,根据本发明一些实施例的内存分析方法可以进一步包括:
S350,获取第一类对象的内存快照信息,
S360,根据第一类对象的内存快照信息和第二类对象中静态对象的引用关系信息,生成目标应用的第二内存快照文件。
在一些实施例中,除了图3A所示的根据第二类对象的静态对象第二引用关系信息确定第一内存快照文件(如Mono静态快照)之外,还可以通过相关技术直接获取第一类对象的内存快照信息(例如利用Unity引擎中的插件Unity memory profiler直接获取Unity引擎相关的内存快照信息),并将第一类对象的内存快照信息与第二类静态对象的第二引用关系信息结合起来,共同形成第二内存快照文件,以使得,与第一内存快照文件相比,第二内存快照文件的信息更丰富,不仅包括第二类对象中的静态对象的引用关系,还包括第一类对象内部的内存相关信息。
在一些实施例中,图3A所示的内存分析方法可以进一步包括:将第一内存快照文件发送至服务器以供服务器通过反序列化解析还原并展示第二类对象中静态对象的第二引用关系信息。如图1和图2所示,终端设备110在生成第一内存快照文件之后,可以将其发送至服务器120,从而在服务器上解析和展示相关的信息。因为,一般来说,用于运行目标应用的终端设备110通常是手机之类的移动设备,其硬件条件具有一定的局限性(例如性能、显示屏大小受限),因此,为了提高工作效率和信息展示效果,可以利用服务器或普通台式机实施内存快照的展示和解析步骤。
图4示出根据本发明一些实施例的内存分析方法的示例实施原理图。
如图4所示,以Unity引擎+Mono编译工具为例,本方案基于Mono的对象管理机制,主要分为了Mono侧、Unity引擎侧。在Unity引擎侧,可通过相关技术直接获取Unity原生对象(即第一类对象)的第一引用关系信息;随后通过引擎内部的自定义接口(API)将其关联到Mono侧,即Mono侧通过引擎侧提供的接口获得Unity对象的第一引用关系信息(例如包含第一类对象中各对象的名称和及其引用路径)的绑定;最后Mono侧通过另外的自定义接口(API)调用Mono库中的函数,递归查找所有被静态类引用的变量(包括静态和非静态变量),同时统计类型信息并存储起来,从而获得所有Mono静态对象(第二类对象中的静态对象)的第二引用关系信息,将所得到的引用关系数据返回给引擎侧;最后引擎侧通过信息处理(比如序列化)得到第一内存快照文件(即Mono静态快照文件)。在递归过程中,通过Unity对象的绑定,可以在Mono侧获得Unity对象的第一引用关系信息,从而在Mono对象引用Unity对象的情况下,可以利用该绑定获取针对Unity对象的引用关系,从而完善Mono静态对象引用关系的获取。
图5示意性示出了根据本发明一些实施例的图3A所示的步骤S330的示例过程。
如图5所示,图3A所示的步骤S330-根据第一类对象的第一引用关系信息,获取内存中第二类对象中的静态对象的引用关系信息可以包括如下步骤S531-533。
在步骤S531处,查找编译工具程序域中的静态类集合,以获取静态类集合中每一个静态类的元信息。
为了获取第二类对象(即编译工具程序域对象,如Mono对象)中静态对象的引用关系,首先需要查找编译工具程序域中的静态类。以Mono作为编译工具为例,按照Mono内部类型和对象管理机制,获取Mono所有静态类构成的静态类集合,从静态类集合的每一个静态类(Static Class)开始,以其作为根节点递归查找其引用关系,直到追踪到所引用的具有具体简单值的变量为止,即可获取完整的所有Mono静态对象(即第二类对象中的静态对象)及其引用关系。
在一些实施例中,可以根据Mono侧自定义的接口调用Mono库中的函数,来查找到Mono侧所有的静态类,获取这些静态类的元信息(例如静态类的名称(Name)、类型(Class)(如类的类名)、字段(Field)、对象值(Value)(如其所引用的对象的首地址)和内存占用的大小 (Size)),以用于后续的所有静态对象及其引用关系的获取。
在步骤S532处,基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,其中每一个静态类的引用链为树状结构,根节点为该静态类,其余各节点都是其父节点所引用的对象,叶节点为没有引用任何对象的对象。
按照Mono内部类型和对象管理机制,针对静态类集合中每一个静态类,可以通过其元信息递归查找其直接引用关系或直接引用对象,并且在查找过程中记录每一个直接引用对象的元信息,从而可以得到以该静态类为根节点的树状引用链,以及各个节点的信息。换言之,上述引用关系查找或获取的过程实际上是一个以静态类为根节点、以引用关系为树枝的树形结构构造过程,该属性结构中的各个节点通过引用关系连接,任意两个直接连接的节点形成父子关系。除了根节点以外,其他节点都是根节点直接或间接引用的对象,而叶节点是没有引用任何对象的节点。
在一些实施例中,基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,包括:
在递归查找直接引用对象的过程中,判断当前查找到的直接引用对象是否属于第二类对象;
响应于当前查找到的直接引用对象不属于第二类对象,通过自定义接口从目标应用的引擎访问第一类对象的第一引用关系信息以实现针对所述当前查找到的直接引用对象的后续递归查找。
如本实施例所述,基于第一类对象的第一引用关系获取第二类对象中静态类的引用链主要体现如下:在查找静态类的引用关系的过程中,如果遇到第一类对象(即引擎中的对象),就需要根据第一类对象第一引用关系信息获取相应的对象的引用路径,并所得到的第一类对象引用路径加入到第二类对象中静态类引用链中,以使得该第二类静态对象的引用链更完整。具体地,以Unity引擎和Mono编译工具为例,在Mono程序域获取Mono侧静态类引用链的过程中可能出现的Unity对象的引用信息,可以利用Unity引擎提供的接口(C++)使得在Mono程序域直接访问Unity引擎中第一类对象的相关信息,例如已得到的第一类对象(Unity对象)第一引用关系信息;随后基于第一类对象的第一引用关系信息获得Mono侧静态类引用链中所需的Unity对象相关信息。
在步骤S533处,根据静态类集合中每一个静态类的引用链,确定第二类对象中的静态对象的第二引用关系信息。
在获得第二类对象中各个静态类的引用链之后,可以根据静态类引用链,直接得到第二类对象中所有静态对象的第二引用关系信息。事实上,静态类引用链涵盖了所有静态对象(包括静态变量和静态类)的元信息、相应的直接或间接引用对象,以及具体引用路径。
图6示意性示出了根据本发明一些实施例的图5所示的步骤S532的示例过程。
如图6所示,图5所示的步骤S532-基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链可以包括如下步骤S631-635。
S631-初始化步骤:将每一个静态对象作为引用链的根节点并设定为当前对象;
S632-直接引用关系判断步骤:根据当前对象的元信息,判断当前对象是否存在直接引用对象;
S633-引用链节点确定步骤:响应于当前对象存在直接引用对象,获取该直接引用对象的元信息并将该直接引用对象作为当前对象的子节点,
S634-递归循环步骤:在获取直接引用对象元信息之后,将直接引用对象作为当前对象,转到S632-直接引用关系判断步骤;
S635-循环结束步骤:响应于当前对象不存在直接引用对象,结束引用链获取。
图6所示的步骤实际上描述了关于第二类对象中以静态类为根节点的引用链的具体获取方式,即递归查找节点引用关系。在初始化步骤S631中,将从编译工具(如Mono)程序域中获取的每一个静态类作为所要构造的引用链的根节点。在开始递归之前,需要设定一个当前对象作为递归循环过程中循环变量,即每次引用关系查找过程所针对的、不断变化的对象。显然该静态类就是递归所针对的初始当前对象,在第一次引用关系查找之后,静态类所引用的对象变为当前对象,以此类推。
在S632-直接引用关系判断步骤中,通过查找当前对象的直接引用关系,判断当前对象是否存在直接引用的对象。响应于不存在直接引用关系,说明递归循环到达引用链的叶节点,于是转到步骤S634,直接结束递归循环;若存在直接引用关系,则转到S633-引用链节点确定步骤,获取该直接引用对象的元信息,并将其作为当前对象的子节点。在子节点确定之后,开启递归循环步骤S634,即将当前子节点(当前直接引用的对象)作为当前对象,继续回到(即递归)S632-直接引用关系查找步骤,开启递归循环,以此类推,直到到达叶节点(即满足S634的循环结束条件)为止。
这样,通过上面的递归查找方式,可以得到以第二类对象中各静态类为根节点的引用链,从该引用链中可以得到各个节点的元信息,以及任意两个节点之间的引用路径,于是基于该引用链可以获取第二类对象中所有静态对象(包括如静态类和静态变量)的元信息及其第二引用关系信息,即每个静态对象直接或间接引用的第一类或第二类对象的元信息以及具体的引用路径。
针对图6中步骤S632所述的直接引用关系的判断,可以根据待查的当前对象(或所属类)的成员变量的具体信息来进行。例如,如果当前对象的成员变量为引用型变量,则其存在直接引用关系或直接引用对象;若为简单值类型变量,则不存在直接引用关系或直接引用对象;对于结构体变量,需要具体判断其成员变量是否存在引用型变量,从而确定直接引用关系。更具体地,例如,首先需要根据当前对象的元信息获得其所属类的数据,尤其是字段(Field)中各个字段的具体类型(class)。随后根据不同类型(class)的成员变量,采用不同方式确定直接引用对象,对于引用型变量,如类类型(即类对象)、数组、字符串等,可以将该引用型成员变量所引用的对象作为当前对象的直接引用对象;对于结构体变量,可以将其被赋值时所对应的结构体对象作为当前对象引用的对象。关于当前对象所属类的具体数据信息的获取,请参见图7。
图7示意性示出Mono对象内存结构图。
在描述第二类对象中静态对象及其引用关系具体查找过程之前,通常需要了解第二类对象的具体内存结构,如Mono对象的内存结构。如图7所示,对于Mono对象(MonoObject),每个Mono Object都有一个虚函数表(VTable),它与这个Mono Object所属的类(Mono Class)对应,通过VTable就能获取到这个对象的类型信息。该类型信息中除了描述该对象的类外,还有每个成员变量的偏移大小,从而按照偏移量可以找到每个成员变量的在内存中的具体位置。
基于图7所示Mono对象内存结构,可以分析并获取任意Mono对象的元信息以及其引用链信息。具体地,对于Mono类对象(即类类型变量),例如类对象a,如图7所示,可以根据内存中存储信息,获取对象a的VTable信息,从而获取对象a的类信息。因为类信息包含多个字段(Field)和偏移地址,每个字段分别存储不同成员变量的值,所以根据类信息的各个字段,索引对象a的各个成员并确定引用型变量(Reference Field)和非引用型变量(如FloatField、Struct Field)。对于引用型变量,例如指针、数组等,可以进一步追踪其指向地址,从而实现对象a的引用链获取。对于简单值类型变量,可以直接从对象a的内存中得到其值(Value)。对于结构体(Struct)变量,可以从其Field信息中读取其成员变量的类型,并按照的各个Field进行分析。
对于数组类型的Mono对象(Mono Array),例如数组对象b,如图7所示,其内存数据中包含数组长度(length),以及指向数组内容地址的指针(Pointer)且在内存中存储有对象b的VTable信息。根据VTable信息可以获取数组对象b的元素的类型(Element Class)信息,根据指针信息获取第一个元素的地址信息,从而追踪到第一个元素,因为各个元素根据VTable中的类型信息所确定的大小而依序存储,所以可以依序对各个元素的引用关系进行确定,从而实现数组对象b的引用链获取。
对于字符串类型的Mono对象(Mono String),例如字符串对象c,与数组类似,其内存数据包含字符串长度(length)和指向地址内容的头指针(chars),该指针可以指向UTF-16型字符。因此可以根据指针信息获取字符串内容的首地址,从而获得该字符串的值。
图8A示意性示出根据本发明一些实施例的内存分析方法中内存对象引用关系的分析逻辑图。
根据图7所示的Mono对象的内存结构图,可以参照图8A所示的逻辑分析第二类对象中静态对象(或全部对象)的引用链。具体地,例如对于第二类对象d,如图8A所示,根据对象d在内存中存储的类型或类信息(class)获取对象d的类型。
如果根据对象d为简单值类型变量,如int, float,则结束引用链的分析,找到该引用链的叶子节点。
如图8A所示,如果对象d被判断为数组类型(Array),则根据上述数组的引用链分析,确定数组的首地址,追踪到数组的内容。进一步地,如果元素内容为简单值(SimpleValue),则该对象d被确定为叶子节点,结束引用链获取;如果元素内容为地址,即元素为引用型变量(Reference),则根据该引用型变量的类型,对其进行引用链递归分析;如果元素内容为结构体(Struct),则遍历结构体的成员变量分别确定引用关系,完善其引用链。
如果对象d被判断为字符串类型(String),则根据图8所示的字符串的引用链分析方法,确定字符串的内容。
图8A所示的内存对象分析逻辑不仅可以适用于第二类(如Mono)对象,也可以适用于第一类(如Unity引擎)对象。具体地,在获取第二类对象中的静态类的引用链的过程中,对于引用链中的第一类对象,可以在Mono程序域查找对象引用的过程中,通过Unity引擎提高的引擎接口(如Unity引擎持有的脚本基类(MonoBehaviour)提供C++接口)来获取Unity引擎的第一类对象中例如包含各对象之间引用路径和对象名称的第一引用关系信息,加入到这个逻辑中,以完善静态类引用链。
图8B示出图6所示的引用链节点确定步骤的示例过程。
依据图8A所示的内存对象分析逻辑图,可以按照内存对象的不同类型,分别获取第二类对象的静态类引用链,即确定引用链中的节点,即当前对象的直接引用对象的元信息。如图8B所示,图6所示的S633-引用链节点确定步骤包括:
S831,根据当前对象的元信息,确定当前对象的成员变量的类型;
S832,响应于当前对象的成员变量为数组类型变量,则从内存中存储的该数组的首地址所指向的元素开始,依序遍历该数组的每个元素,从而获得每个元素所引用的对象的元信息,作为直接引用对象的元信息;
S833, 响应于当前对象的成员变量为字符串类型变量,则根据内存中存储的该字符串的首地址所指向的字符串对象,来获取该字符串对象的元信息,作为直接引用对象的元信息;
S834, 响应于当前对象的成员变量为类类型变量,则根据内存中存储的该类类型变量所指向的类对象的首地址,依序遍历该类中的每个成员变量,从而获得该类对象的元信息,作为直接引用对象的元信息。
图9示出根据本发明另一些实施例的内存分析方法的流程图。如图9所示,该内存分析方法包括:
S910,接收针对目标应用的内存分析请求;
S920,响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;
S930,根据第一类对象的第一引用关系信息,获取内存中的第二类对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;
S940,根据第二类对象的第二引用关系信息,生成目标应用的第三内存快照文件。
如图9所示,在一些实施例中,除了通过获取第二类对象的静态变量的引用关系生成内存快照之外,也可以通过编译工具(如Mono)的对象管理机制直接获取所有的第二类对象(如Mono对象),并对其引用关系进行递归分析,以得到第三内存快照文件。这种方案获取的数据会比上述由静态对象引用关系得到的第一内存快照文件详细很多。但由于对象数量从静态变量及其引用扩展到了所有的第二类对象,因此耗时相比前述方案可能也会增多。
可选地,为了实现精确的内存分析,在获取第二类对象中所有对象(包括静态和非静态对象)的引用关系之后,可以仅查找每个对象的直接引用关系即可,即获取其直接引用的第二类对象或第一类对象的元信息。这样就可以得到整个第二类对象中所有对象的引用关系或引用链,从而使得据此形成的第三内存快照文件可以展示更多、更详细、更精确的内存分析信息,以利于应用或游戏开发人员更精准地解决内存泄漏等问题。
图10示意性示出了根据本发明一些实施例的内存分析设备1000的示例框图。内存分析设备1000可以对应于图1所示的终端设备110。客内存分析设备1000可以包括接收模块1010、第一获取模块1020、第二获取模块1030和生成模块1040。
接收模块1010被配置成接收针对目标应用的内存分析请求。第一获取模块1020被配置成响应于内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合。第二获取模块1030被配置成根据第一类对象的第一引用关系信息,获取内存中第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合。生成模块1040被配置成根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。
图11A示意性示出了根据本发明一些实施例的内存分析系统1100的示例框图。内存分析系统1100可以对应于图1所示的根据本发明的内存分析方法的示例环境100。内存分析系统1100可以包括彼此通信连接的内存分析设备1110和内存分析服务器1120,其可以分别对应于图1所示终端设备110和服务器120。内存分析系统1100可以用于实现根据本发明一些实施例的内存分析方法。内存分析设备1110也可以对应于图10所示的用于实现根据本发明一些实施例的内存分析方法的内存分析设备1000。
如图11A所示,内存分析设备1110包括:第一接收模块1111、第一获取模块1112、第二获取模块1113、快照生成模块1114、第一发送模块1115。
第一接收模块1111被配置成从内存分析服务器1120接收针对目标应用的内存分析请求。第一获取模块1112被配置成响应于针对目标应用的内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合。第二获取模块1113被配置成根据第一类对象的第一引用关系信息,获取内存中第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合。快照生成模块1114被配置成根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。第一发送模块1115被配置成将第一内存快照文件发送至内存分析服务器1120。
如图11A所示,内存分析服务器1120包括:第二发送模块1121、第二接收模块1122、快照解析模块1123、快照展示模块1124。第二发送模块1121被配置成向内存分析设备1110发送针对目标引用的内存分析请求。第二接收模块1122被配置成从内存分析设备1110接收第一内存快照文件。快照解析模块1123被配置成从第一内存快照文件中解析出第二类对象中静态对象的第二引用关系信息。快照展示模块1124被配置成展示第二类对象中静态对象的第二引用关系信息。
如图11A所示,内存分析系统1100可以例如从内存分析服务器1120的第二发送模块1121开始,按照箭头方向各模块依次执行相应动作,以实现根据本发明一些实施例的内存分析方法。具体地,首先,第二发送模块1121向内存分析设备1110的第一接收模块1111发送内存分析请求;随后,内存分析设备1110根据内存分析请求利用第一和第二获取模块1112、1113分别获取第一类对象的第一引用关系信息和第二类对象中静态对象的第二引用关系信息,之后快照生成模块1114根据第二类对象中静态对象第二引用关系信息生成第一内存快照文件;接着,第一发送模块1115将第一内存快照文件发送至内存分析服务器1120;内存分析服务器1120的第二接收模块1122接收到第一快照文件之后,分别利用快照解析模块1123和快照展示模块1124对第一内存快照文件解析还原第二类对象中静态对象第二引用关系信息并展示该第二引用关系信息。
在内存分析服务器1120获得第一内存快照文件之后,为了让用户(例如软件开发和测试人员)能够轻松查看、浏览目标应用(或游戏)运行时的内存情况,需要利用快照解析模块1123对已经序列化的第一内存快照文件进行解析,将其还原为用户可看信息。例如可以通过反序列将第一内存快照文件还原为自定义的Mono对象(Object)和Mono 类(Class)。由于服务器在解析第一快照文件时无法直接得知Mono库的类型,因此为了进行展示和关系引用,需要自定义例如Class、Field、Mono Object、Mono Data、Unity Data这几种类型用于存放通过第一快照文件解析得到的Object和Class信息。它们具体的展示内容,是通过byte数组中获取的field(字段)、name(名称)、class(类型)等信息进行展示。
图11B示意性示出根据本发明一些实施例的内存分析系统的内存快照的示例展示界面。在第一内存快照文件被解析之后,利用快照展示模块1124展示解析后的内存快照信息。例如,如图11B所示,示例快照界面中所展示的快照信息可以包括静态类的引用链信息,例如各节点的数据、引用路径、节点深度等。此外,图11B所示的快照界面还可以包括提供递归查找关系链、统计类信息和快照对比等功能,让应用或游戏开发能够快速准确定位到其中的Mono内存问题。
应注意,上述各种模块可以以软件或硬件或两者的组合来实现。多个不同模块可以在同一软件或硬件结构中实现,或者一个模块可以由多个不同的软件或硬件结构实现。
图12示意性示出了根据本发明一些实施例的计算设备1200的示例框图。计算设备1200可以代表用以实现本文描述的各种装置或模块和/或执行本文描述的各种方法的设备。计算设备1200可以是例如服务器、台式计算机、膝上型计算机、平板、智能电话、智能手表、可穿戴设备或任何其它合适的计算设备或计算系统,其可以包括从具有大量存储和处理资源的全资源设备到具有有限存储和/或处理资源的低资源设备的各种级别的设备。在一些实施例中,上面关于图10至11A描述的内存分析设备1000及内存分析系统1100可以分别在一个或多个计算设备1200中实现。
如图所示,示例计算设备1200包括彼此通信耦合的处理系统1201、一个或多个计算机可读介质1202以及一个或多个I/O接口1203。尽管未示出,但是计算设备1200还可以包括将各种组件彼此耦合的系统总线或其他数据和命令传送系统。系统总线可以包括不同总线结构的任何一个或组合,所述总线结构可以是诸如存储器总线或存储器控制器、外围总线、通用串行总线和/或利用各种总线架构中的任何一种的处理器或局部总线。或者,还可以包括诸如控制和数据线。
处理系统1201代表使用硬件执行一个或多个操作的功能。因此,处理系统1201被图示为包括可被配置为处理器、功能块等的硬件元件1204。这可以包括在硬件中实现作为专用集成电路或使用一个或多个半导体形成的其它逻辑器件。硬件元件1204不受其形成的材料或其中采用的处理机构的限制。例如,处理器可以由(多个)半导体和/或晶体管(例如,电子集成电路(IC))组成。在这样的上下文中,处理器可执行指令可以是电子可执行指令。
计算机可读介质1202被图示为包括存储器/存储装置1205。存储器/存储装置1205表示与一个或多个计算机可读介质相关联的存储器/存储装置。存储器/存储装置1205可以包括易失性介质(诸如随机存取存储器(RAM))和/或非易失性介质(诸如只读存储器(ROM)、闪存、光盘、磁盘等)。存储器/存储装置1205可以包括固定介质(例如,RAM、ROM、固定硬盘驱动器等)以及可移动介质(例如,闪存、可移动硬盘驱动器、光盘等)。示例性地,存储器/存储装置1205可以用于存储上文实施例中提及的第一类别用户的第一音频、请求的排队列表等。计算机可读介质1202可以以下面进一步描述的各种其他方式进行配置。
一个或多个I/O(输入/输出)接口1203代表允许用户向计算设备1200键入命令和信息并且还允许使用各种输入/输出设备将信息显示给用户和/或发送给其他组件或设备的功能。输入设备的示例包括键盘、光标控制设备(例如,鼠标)、麦克风(例如,用于语音输入)、扫描仪、触摸功能(例如,被配置为检测物理触摸的容性或其他传感器)、相机(例如,可以采用可见或不可见的波长(诸如红外频率)将不涉及触摸的运动检测为手势)、网卡、接收机等等。输出设备的示例包括显示设备(例如,监视器或投影仪)、扬声器、打印机、触觉响应设备、网卡、发射机等。示例性地,在上文描述的实施例中,第一类别用户以及第二类别用户可以通过其各自的终端设备上的输入接口来进行输入以发起请求以及录入音频和/或视频等,并且可以通过输出接口来查看各种通知以及观看视频或聆听音频等。
计算设备1200还包括内存分析策略1206。内存分析策略1206可以作为计算程序指令存储在存储器/存储装置1205中。内存分析策略1206可以连同处理系统1201等一起实现关于图10和图11A描述的内存分析设备1000以及内存分析系统1100的各个模块的全部功能。
本文可以在软件、硬件、元件或程序模块的一般上下文中描述各种技术。一般地,这些模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、元素、组件、数据结构等。本文所使用的术语“模块”、“功能”等一般表示软件、固件、硬件或其组合。本文描述的技术的特征是与平台无关的,意味着这些技术可以在具有各种处理器的各种计算平台上实现。
所描述的模块和技术的实现可以存储在某种形式的计算机可读介质上或者跨某种形式的计算机可读介质传输。计算机可读介质可以包括可由计算设备1200访问的各种介质。作为示例而非限制,计算机可读介质可以包括“计算机可读存储介质”和“计算机可读信号介质”。
与单纯的信号传输、载波或信号本身相反,“计算机可读存储介质”是指能够持久存储信息的介质和/或设备,和/或有形的存储装置。因此,计算机可读存储介质是指非信号承载介质。计算机可读存储介质包括诸如易失性和非易失性、可移动和不可移动介质和/或以适用于存储信息(诸如计算机可读指令、数据结构、程序模块、逻辑元件/电路或其他数据)的方法或技术实现的存储设备之类的硬件。计算机可读存储介质的示例可以包括但不限于RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字通用盘(DVD)或其他光学存储装置、硬盘、盒式磁带、磁带,磁盘存储装置或其他磁存储设备,或其他存储设备、有形介质或适于存储期望信息并可以由计算机访问的制品。
“计算机可读信号介质”是指被配置为诸如经由网络将指令发送到计算设备1200的硬件的信号承载介质。信号介质典型地可以将计算机可读指令、数据结构、程序模块或其他数据体现在诸如载波、数据信号或其它传输机制的调制数据信号中。信号介质还包括任何信息传递介质。作为示例而非限制,信号介质包括诸如有线网络或直接连线的有线介质以及诸如声、RF、红外和其它无线介质的无线介质。
如前所述,硬件元件1204和计算机可读介质1202代表以硬件形式实现的指令、模块、可编程器件逻辑和/或固定器件逻辑,其在一些实施例中可以用于实现本文描述的技术的至少一些方面。硬件元件可以包括集成电路或片上系统、专用集成电路(ASIC)、现场可编程门阵列(FPGA)、复杂可编程逻辑器件(CPLD)以及硅中的其它实现或其他硬件设备的组件。在这种上下文中,硬件元件可以作为执行由硬件元件所体现的指令、模块和/或逻辑所定义的程序任务的处理设备,以及用于存储用于执行的指令的硬件设备,例如,先前描述的计算机可读存储介质。
前述的组合也可以用于实现本文所述的各种技术和模块。因此,可以将软件、硬件或程序模块和其它程序模块实现为在某种形式的计算机可读存储介质上和/或由一个或多个硬件元件1204体现的一个或多个指令和/或逻辑。计算设备1200可以被配置为实现与软件和/或硬件模块相对应的特定指令和/或功能。因此,例如通过使用处理系统的计算机可读存储介质和/或硬件元件1204,可以至少部分地以硬件来实现将模块实现为可由计算设备1200作为软件执行的模块。指令和/或功能可以由例如一个或多个计算设备1200和/或处理系统1201执行/可操作以实现本文所述的技术、模块和示例。
本文描述的技术可以由计算设备1200的这些各种配置来支持,并且不限于本文所描述的技术的具体示例。
在本说明书的描述中,术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点被包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或多个用于实现定制逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序(包括根据所涉及的功能按基本同时的方式或按相反的顺序)来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,则可用本领域公知的下列技术中的任一项或它们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路、具有合适的组合逻辑门电路的专用集成电路、可编程门阵列(Programmable Gate Array)、现场可编程门阵列(Field Programmable Gate Array)等。
本技术领域的普通技术人员可以理解上述实施例方法的全部或部分步骤可以通过程序指令相关的硬件完成,所述程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括执行方法实施例的步骤之一或其组合。
此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。

Claims (15)

1.一种内存分析方法,包括:
接收针对目标应用的内存分析请求;
响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;
根据第一类对象的第一引用关系信息,获取内存中的第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;
根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。
2.根据权利要求1所述的方法,其中第一类对象的第一引用关系信息包括第一类对象中各对象的名称和各对象之间的引用路径;第二类对象中的静态对象包括静态变量和静态类。
3.根据权利要求2所述的方法,第二类对象中静态对象的第二引用关系信息包括该静态对象的元信息、该静态对象直接和/或间接引用的对象的元信息、引用路径。
4.根据权利要求3所示的方法,其中所述静态对象的元信息包括:该静态对象的名称、类型、字段、对象值和内存占用的大小中至少一个,所述静态对象直接和间接引用的对象的元信息包括所述静态对象直接和/或间接引用的对象的名称、类型、字段、对象值和内存占用的大小中至少一个。
5.根据权利要求3所述的方法,其中所述根据第一类对象的第一引用关系信息,获取内存中第二类对象中的静态对象的第二引用关系信息包括:
查找编译工具程序域中的静态类集合,以获取静态类集合中每一个静态类的元信息;
基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,其中每一个静态类的引用链为树状结构,根节点为该静态类,其余各节点都是其父节点的直接引用对象,叶节点为没有直接引用对象的对象;
根据所述静态类集合中每一个静态类的引用链,确定第二类对象中的静态对象的第二引用关系信息;
其中,所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,包括:
在递归查找直接引用对象的过程中,判断当前查找到的直接引用对象是否属于第二类对象;
响应于当前查找到的直接引用对象不属于第二类对象,通过自定义接口从目标应用的引擎访问第一类对象的第一引用关系信息以实现针对所述当前查找到的直接引用对象的后续递归查找。
6.根据权利要求5所述的方法,其中所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链包括:
初始化步骤:将每一个静态类作为引用链的根节点并设定为当前对象;
直接引用关系判断步骤:根据当前对象的元信息,判断当前对象是否存在直接引用对象;
引用链节点确定步骤:响应于当前对象存在直接引用对象,获取该直接引用对象的元信息并将该直接引用对象作为当前对象的子节点;
递归循环步骤:在获取所述直接引用对象元信息之后,将所述直接引用对象作为当前对象,转到所述直接引用关系判断步骤;
循环结束步骤:响应于当前对象不存在直接引用对象,结束引用链获取。
7.根据权利要求6所述的方法,其中所述引用链节点确定步骤包括:
根据当前对象的元信息,确定当前对象中成员变量的类型;
响应于当前对象的成员变量为数组类型变量,则从内存中存储的该数组的首地址所指向的元素开始,依序遍历该数组的每个元素,从而获得每个元素所引用的对象的元信息,作为直接引用对象的元信息;
响应于当前对象的成员变量为字符串类型变量,则根据内存中存储的该字符串的首地址所指向的字符串对象,来获取该字符串对象的元信息,作为直接引用对象的元信息;
响应于当前对象的成员变量为类类型变量,则根据内存中存储的该类类型变量所指向的类对象的首地址,依序遍历该类对象中的每个成员变量,从而获得该类对象的元信息,作为直接引用对象的元信息。
8.根据权利要求1所述的方法,进一步包括:
获取第一类对象的内存快照信息;
根据第一类对象的内存快照信息和第二类对象中静态对象的第二引用关系信息,生成目标应用的第二内存快照文件。
9.根据权利要求1所述的方法,其中,所述根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件,包括:
将第二类对象中静态对象的第二引用关系信息序列化,以形成目标应用的第一内存快照文件。
10.一种内存分析方法,包括:
接收针对目标应用的内存分析请求;
响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;
根据第一类对象的第一引用关系信息,获取内存中的第二类对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;
根据第二类对象的第二引用关系信息,生成目标应用的第三内存快照文件。
11.根据权利要求10所述的方法,其中第二类对象的第二引用关系信息包括第二类对象中每一个对象的元信息、以及其直接引用的第二类对象或第一类对象中对象的元信息。
12.一种内存分析设备,包括:
接收模块,其配置成接收针对目标应用的内存分析请求;
第一获取模块,其配置成响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;
第二获取模块,其配置成根据第一类对象的第一引用关系信息,获取内存中第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;
生成模块,其配置成根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。
13.一种内存分析系统,包括内存分析设备和内存分析服务器,其中内存分析设备包括:
第一接收模块,其配置成从内存分析服务器接收针对目标应用的内存分析请求;
第一获取模块,其配置成响应于目标应用的分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;
第二获取模块,其配置成根据第一类对象的第一引用关系信息,获取内存中第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;
快照生成模块,其配置成根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件;
第一发送模块,其配置成将第一内存快照文件发送至内存分析服务器,
内存分析服务器包括:
第二发送模块,其配置成向内存分析设备发送针对目标应用的内存分析请求;
第二接收模块,其配置成从内存分析设备接收第一内存快照文件;
快照解析模块,其配置成从第一内存快照文件中解析出第二类对象中静态对象的第二引用关系信息;
快照展示模块,其配置成展示第二类对象中静态对象的第二引用关系信息。
14. 一种计算设备,包括:
处理器;以及
存储器,其上存储有指令,所述指令当在所述处理器上执行时促使所述处理器执行权利要求1-11中任一项所述的方法。
15.一种或多种计算机可读存储介质,其上存储有计算机可读指令,所述计算机可读指令在被执行时实现权利要求1-11中任一项所述的方法。
CN202010712594.4A 2020-07-22 2020-07-22 内存分析方法、设备和系统以及计算设备、计算机可读存储介质 Active CN111858339B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010712594.4A CN111858339B (zh) 2020-07-22 2020-07-22 内存分析方法、设备和系统以及计算设备、计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010712594.4A CN111858339B (zh) 2020-07-22 2020-07-22 内存分析方法、设备和系统以及计算设备、计算机可读存储介质

Publications (2)

Publication Number Publication Date
CN111858339A true CN111858339A (zh) 2020-10-30
CN111858339B CN111858339B (zh) 2023-11-28

Family

ID=72950231

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010712594.4A Active CN111858339B (zh) 2020-07-22 2020-07-22 内存分析方法、设备和系统以及计算设备、计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN111858339B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112711629A (zh) * 2020-12-30 2021-04-27 浙江中控技术股份有限公司 数据及关联数据导入导出方法、装置、设备及存储介质
CN113010179A (zh) * 2021-02-23 2021-06-22 深圳市广和通无线股份有限公司 存储架构下的软件存储方法

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120254838A1 (en) * 2011-03-29 2012-10-04 International Business Machines Company Method and apparatus for tracing memory accesses
CN103714004A (zh) * 2014-01-02 2014-04-09 金蝶软件(中国)有限公司 Jvm在线内存泄露分析方法及系统
CN107291598A (zh) * 2017-08-07 2017-10-24 腾讯科技(深圳)有限公司 监控方法、监控装置、监控设备和存储介质
WO2018072408A1 (zh) * 2016-10-18 2018-04-26 广州市动景计算机科技有限公司 一种内存分析方法、装置、系统以及计算设备
CN108845934A (zh) * 2018-05-24 2018-11-20 深圳市腾讯网络信息技术有限公司 内存泄漏源的定位方法和装置、存储介质、电子装置
CN110231994A (zh) * 2019-06-20 2019-09-13 深圳市腾讯网域计算机网络有限公司 内存分析方法、装置和计算机可读存储介质

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120254838A1 (en) * 2011-03-29 2012-10-04 International Business Machines Company Method and apparatus for tracing memory accesses
CN103714004A (zh) * 2014-01-02 2014-04-09 金蝶软件(中国)有限公司 Jvm在线内存泄露分析方法及系统
WO2018072408A1 (zh) * 2016-10-18 2018-04-26 广州市动景计算机科技有限公司 一种内存分析方法、装置、系统以及计算设备
CN107967205A (zh) * 2016-10-18 2018-04-27 广州市动景计算机科技有限公司 一种内存分析方法、装置、系统以及计算设备
CN107291598A (zh) * 2017-08-07 2017-10-24 腾讯科技(深圳)有限公司 监控方法、监控装置、监控设备和存储介质
CN108845934A (zh) * 2018-05-24 2018-11-20 深圳市腾讯网络信息技术有限公司 内存泄漏源的定位方法和装置、存储介质、电子装置
CN110231994A (zh) * 2019-06-20 2019-09-13 深圳市腾讯网域计算机网络有限公司 内存分析方法、装置和计算机可读存储介质

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112711629A (zh) * 2020-12-30 2021-04-27 浙江中控技术股份有限公司 数据及关联数据导入导出方法、装置、设备及存储介质
CN113010179A (zh) * 2021-02-23 2021-06-22 深圳市广和通无线股份有限公司 存储架构下的软件存储方法
CN113010179B (zh) * 2021-02-23 2024-03-15 深圳市广和通无线股份有限公司 基于实时操作系统的独立应用的运行方法

Also Published As

Publication number Publication date
CN111858339B (zh) 2023-11-28

Similar Documents

Publication Publication Date Title
CN108027722B (zh) 在编译和部署中动态更新应用
US10445216B2 (en) Debugging program code at instruction level through emulation
EP3005121B1 (en) Debugging native code by transitioning from execution in native mode to execution in interpreted mode
US9336128B2 (en) Method and system for code analysis using symbolic types
KR20050077494A (ko) 사용자 인터페이스에서 동적 영역을 마스킹하여 사용자인터페이스 일관성을 테스트할 수 있는 방법 및 시스템
CN106649084A (zh) 函数调用信息的获取方法及装置、测试设备
US8984487B2 (en) Resource tracker
EP4085336B1 (en) Computer resource leak detection
CN111858339B (zh) 内存分析方法、设备和系统以及计算设备、计算机可读存储介质
US10331543B2 (en) Performance diagnostics via offline replay
US9880925B1 (en) Collecting structured program code output
JP6329329B2 (ja) コード・キャッシング・システム
CN114547604A (zh) 一种应用检测方法、装置、存储介质及电子设备
CN109284222B (zh) 软件单元、数据处理系统中的项目测试方法、装置及设备
CN116339818B (zh) 代码变更类型的筛选方法、电子设备及可读存储介质
CN114077575A (zh) 用于内存快照文件的格式转换方法、设备和系统
US9244657B2 (en) System and method for an object instance acquirer
CN103513989B (zh) 按键数据获取方法及装置
CN113220586A (zh) 一种自动化的接口压力测试执行方法、装置和系统
US9703532B1 (en) Dynamically updating class instances based on class definition changes
US11755313B2 (en) Implementing changes made to source code of reloadable types at runtime
US20230214310A1 (en) Infrastructure to integrate an integrated development environment (ide) with game engines
CN116069333A (zh) 程序编译方法、装置、电子设备、存储介质和程序产品
CN117873894A (zh) 崩溃风险检测方法、计算机设备及计算机存储介质
CN118363990A (zh) Dll缓存处理方法、装置及电子设备

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