CN110231994B - 内存分析方法、装置和计算机可读存储介质 - Google Patents

内存分析方法、装置和计算机可读存储介质 Download PDF

Info

Publication number
CN110231994B
CN110231994B CN201910535526.2A CN201910535526A CN110231994B CN 110231994 B CN110231994 B CN 110231994B CN 201910535526 A CN201910535526 A CN 201910535526A CN 110231994 B CN110231994 B CN 110231994B
Authority
CN
China
Prior art keywords
memory
occupied
instantiation
value
resource
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
CN201910535526.2A
Other languages
English (en)
Other versions
CN110231994A (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 Tencent Domain Computer Network Co Ltd
Original Assignee
Shenzhen Tencent Domain Computer 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 Shenzhen Tencent Domain Computer Network Co Ltd filed Critical Shenzhen Tencent Domain Computer Network Co Ltd
Priority to CN201910535526.2A priority Critical patent/CN110231994B/zh
Publication of CN110231994A publication Critical patent/CN110231994A/zh
Application granted granted Critical
Publication of CN110231994B publication Critical patent/CN110231994B/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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • 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
    • 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45583Memory management, e.g. access or allocation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本申请涉及一种内存分析方法、装置、计算机可读存储介质和计算机设备,所述方法包括:接收内存分析指令,内存分析指令携带待分析程序标识;获取待分析程序标识对应的应用程序运行时内存中的对象;查找对象中的实例化对象,并确定实例化对象对应的赋值类型;根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值。可以具体确定出实例化对象占用的内存值,精确定位到内存的使用情况,在进行应用程序性能完善时,直接根据实例化对象占用的内存值,准确的找出需要完善的部分,提高了应用程序性能完善的效率。

Description

内存分析方法、装置和计算机可读存储介质
技术领域
本申请涉及计算机技术领域,特别是涉及一种内存分析方法、装置、计算机可读存储介质和计算机设备。
背景技术
随着计算机技术的发展,在计算机应用程序的使用过程中,对应用程序的内存应用的管理,是确保应用程序的应用流畅度、确保用户体验的一项重要内容。以基于跨平台的游戏引擎(如:Unity)开发的游戏应用程序为例,如果没有做好内存的管理问题,游戏极有可能会出现卡顿,闪退等现象。
为了做好内存的管理问题,需要对计算机应用程序的内存占用情况进行分析,以据此在计算机应用程序的开发和优化过程中进行完善。然而,目前的内存分析方式,只能简要的分析出为该应用程序已分配内存大小和该应用程序实际已占用大小,或者是分析出某个具体的基础数据类型的内存占用情况,所获得的内存分析结果并不能直接的应用于对应用程序性能的完善,因此,应用程序性能完善的工作效率低。
发明内容
基于此,有必要针对应用程序性能完善的工作效率低的问题,提供一种内存分析方法、装置、计算机可读存储介质和计算机设备。
一种内存分析方法,包括:
接收内存分析指令,所述内存分析指令携带待分析程序标识;
获取所述待分析程序标识对应的应用程序运行时内存中的对象;
查找所述对象中的实例化对象,并确定所述实例化对象对应的赋值类型;
根据所述实例化对象对应的赋值类型,分析确定所述实例化对象占用的内存值。
一种内存分析装置,包括:
指令接收模块,用于接收内存分析指令,所述内存分析指令携带待分析程序标识;
对象获取模块,用于获取所述待分析程序标识对应的应用程序运行时内存中的对象;
实例化对象获取模块,用于查找所述对象中的实例化对象,并确定所述实例化对象对应的赋值类型;
内存值分析模块,用于根据所述实例化对象对应的赋值类型,分析确定所述实例化对象占用的内存值。
一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行所述方法的步骤。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行所述方法的步骤。
上述内存分析方法、装置、计算机可读存储介质和计算机设备,通过接收内存分析指令,内存分析指令携带待分析程序标识;获取待分析程序标识对应的应用程序运行时内存中的对象;查找对象中的实例化对象,并确定实例化对象对应的赋值类型;根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值。可以具体确定出实例化对象占用的内存值,精确定位到内存的使用情况,在进行应用程序性能完善时,直接根据实例化对象占用的内存值,准确的找出需要完善的部分,提高了应用程序性能完善的效率。
附图说明
图1为一个实施例中内存分析方法的应用环境图;
图2为一个实施例中内存分析方法的流程示意图;
图3为另一个实施例中内存分析方法的流程示意图;
图4为一个实施例中内存分析方法的输出的分析结果图;
图5为进行内存分析方法之前进行代码导入的导入代码包界面示意图;
图6为进行内存分析方法之前进行分析设置的分析设置界面示意图;
图7为一个实施例中内存分析方法的Mono内存模块的内存分析的流程示意图;
图8为一个实施例中内存分析方法的Unity资源内存模块的内存分析的流程示意图;
图9为一个实施例中内存分析装置的结构框图;
图10为另一个实施例中内存分析装置的结构框图;
图11为另一个实施例中内存分析装置的结构框图;
图12为一个实施例中计算机设备的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
图1为一个实施例中内存分析方法的应用环境图。该应用环境涉及终端110,还可以涉及服务器120。终端110与服务器120通过网络连接。其中,通过终端110获取应用程序运行在对应的内存中生成的对象。其中,对应的内存可以是应用程序在终端运行时对应的运行内存,也可以是应用程序运行在服务器120时,为该应用程序分配的对应的内存。然后查找对象中的实例化对象,并确定实例化对象对应的赋值类型;根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值。终端110具体可以是台式终端或移动终端,移动终端具体可以手机、平板电脑、笔记本电脑等中的至少一种。服务器120可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
如图2所示,在一个实施例中,提供了一种内存分析方法。本实施例主要以该方法应用于上述图1中的终端110来举例说明。参照图2,该内存分析方法具体包括如下步骤:
步骤S202,接收内存分析指令,内存分析指令携带待分析程序标识。
其中,内存分析指令是用于指示开始进行内存分析的指令,该内存分析指令中携带的待分析程序标识,用以指示对该待分析程序标识对应的应用程序所占用的内存进行分析。一些实施例中,可以通过用户触发终端的方式(例如操作终端界面上的相关按键灯),获得该内存分析指令,在触发内存分析指令时还指定需要进行内存分析的应用程序。一些实施例中,可以是通过检测是否达到分析条件自动触发内存分析指令,如:到达预设时间时,自动触发内存分析指令。待分析程序标识用于识别待分析的应用程序,待分析的应用程序可以只有一个,也可以有多个,当有多个待分析的应用程序时,可以通过待分析程序标识确定当前分析的应用程序。该应用程序可以是基于跨平台的游戏引擎(Unity)开发的Windows(Windows操作系统)、MacOS(苹果操作系统)、Linux平台(Linux操作系统)的单机游戏,或是ios(苹果系统)、Android(安卓系统)移动设备的游戏。
步骤S204,获取待分析程序标识对应的应用程序运行时内存中的对象。
其中,根据待分析程序标识确定对应的应用程序,该应用程序为需要进行内存分析的应用程序。该内存指应用程序运行时为该应用程序分配的内存,应用程序运行时内存中的对象,指该应用程序运行过程中,在其对应的内存中装载的实例,具有相关的成员变量和成员函数(也称为:方法),该对象是程序集内部的当前已加载到内存中的所有对象。以应用程序为基于Unity开发的应用程序为例,应用程序的Unity程序集会加载到mono虚拟机,通过mono虚拟机进行编译并运行,并为该应用程序分配对应的内存。通过mono虚拟机进行编译并运行后,可获得该应用程序运行时内存中生成的对象。其中,程序集指的打包存储了程序实现的所有类和接口等代码的存储文件,以采用C#(C#指的是一个简单的、现代的、通用的、面向对象的编程语言)实现应用程序为例,存储文件通常以dll文件(动态链接库文件)形式存在,打包了程序实现的所有类和接口等代码,是unity脚本程序的存储格式。mono虚拟机指的是运行在unity游戏底层的一个实时编译引擎,支持跨平台运行,该虚拟机可以将公共中间语言代码实时编译成机器代码,实现跨平台。
在一个实施例中,获取待分析程序标识对应的应用程序运行时内存中的对象的步骤,包括:通过反射接口,获得待分析程序标识对应的应用程序运行时内存中的对象。
其中,反射接口指的是基于反射技术的反射接口,用于获取应用程序运行后,程序集内部的当前已加载到内存中的所有对象和对象之间的引用关系,通过反射技术可以得到程序集内部的接口、类、方法、成员等属性,还可以动态创建一个实例并执行其中的方法。以用C#语言实现程序集为例,可以通过函数Type.getFields()获得程序集内部的当前已加载到内存中的所有对象和对象之间的引用关系。
在一个实施例中,在获取待分析程序标识对应的应用程序运行时内存中的对象时,还获取各对象的对象引用链。
其中,对象的对象引用链指的是该对象的引用情况,具体可以是例如各对象之间的应用关系。在分析出各对象的内存占用情况的同时,还可以获取各对像的引用情况,从而得到内存申请的路径,方便获知内存占用过大的原因。
步骤S206,查找对象中的实例化对象,并确定实例化对象对应的赋值类型。
其中,上述获取的在应用程序运行时内存中的对象,是应用程序的程序集内部,当前已加载到内存中所有对象,所有对象中,有些对象没有被赋值,即没有实例化,而有些对象是当前已经被实例化的。如:通过调用反射接口获取应用程序的整个程序集里面声明的内容,包括有int i和int j=4,int i仅是为了声明变量i,并没有对i进行赋值,因此,inti并不是实例化对象,而int j=4有对j进行赋值,因此int j是一个实例化对象。实例化对象指的是实例化后的对象,实例化是指在面向对象的编程中,用类创建对象的过程,是将一个抽象的概念类,具体到该类实物的过程。实例化对象可以有多个,也可以只有一个,根据查找到的实例化对象确定。
实例化对象对应的赋值类型,指对象的变量被赋值的方式,赋值类型可以包括:值类型和引用类型。值类型赋值是重新创建一个副本,而引用类型的赋值是共享同一块内存(副本),是指向同一块内存(引用类型的名字相当于指向操作),值类型包括:简单类型、枚举、结构等;引用类型包括:类类型、接口类型、数组类型和委托类型等。
在一个实施例中,查找对象中的实例化对象,并确定实例化对象对应的赋值类型的步骤,包括:在对象有赋值时,确定对象为实例化对象;根据为对象赋值的赋值方式,确定实例化对象对应的赋值类型。
其中,对当前已加载到内存中所有对象进行筛选,通过遍历的方式对各个对象进行遍历,遍历每个对象有没有赋值,有赋值则可确定该对象为实例化对象,没有赋值则不是实例化对象,取实例化对象进行内存分析。根据对象的变量的赋值方式确定赋值类型,如:某个对象赋值是重新创建一个副本,则确定该对象的变量为值类型变量,而另一个对象赋值是共享同一块内存,是指向同一块内存,则可以确定另一个对象的变量为引用类型变量。
步骤S208,根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值。
其中,实例化对象占用的内存值指的是该实例化后的对象在内存中当前使所用的内存大小,以应用程序在mono虚拟机上运行为例,具体可以是该实例化后的对象在mono内存中当前使所用的内存大小。其中,mono内存指的是游戏业务代码在mono虚拟机中运行时申请的内存,是托管堆内存。实例化对象对应的赋值类型包括值类型和引用类型,值类型的变量直接包含他们的数据,直接存储其值,引用类型存储对他们的数据的引用。根据不同的赋值类型,可以分析出各实例化对象在当前使所的内存大小。
在一个实施例中,根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值的步骤,包括:
在赋值类型为值类型时,将实例化对象的变量所赋的值所占用的内存空间大小,作为实例化对象占用的内存值;在赋值类型为引用类型时,获取实例化对象的变量所引用的成员所占用的内存空间大小,并基于成员所占用的内存空间大小,确定实例化对象所占用的内存值。
其中,内存空间是指主存储器空间(物理地址空间)或系统为一个用户程序分配的内存空间。赋值类型为值类型时,直接存储其值,该值指的是该实例化对象的变量被赋的值,如:int i=4,4即为i被赋的值。会根据该值的实际数据量所占用内存大小分配对应的内存空间进行存储,该值所占用的内存空间大小,即为实例化对象占用的内存值。在赋值类型为引用类型时,该实例化对象的变量引用对应的成员,则基于该成员所占用的内存空间大小,确定该实例化对象所占用的内存值,成员可以是多个,也可以是一个,从而获得各实例化对象占用的内存值。
在一个实施例中,在实例化对象引用的成员包括两个以上时,基于成员所占用的内存空间大小,确定实例化对象所占用的内存值的步骤,包括:将各成员所占用的内存空间大小之和,作为实例化对象所占用的内存值。
其中,每个成员都对应占用了一定的内存空间,当实例化对象引用多个成员时,该实例化对象所占用的内存值,应当为该实例化对象所引用的所有成员占用的内存空间大小之和。
在一个实施例中,还包括:在成员为值类型成员时,将值类型成员对应的值所占用的内存空间大小,作为成员所占用的内存空间大小;若成员为对象类型成员,根据对象类型成员对应的子成员所占用的内存空间大小,确定所述成员所占用的内存空间大小。
其中,值类型成员指的是该实例化对象所引用的成员变量(指的是被赋值的变量)的赋值类型为值类型的成员,值类型成员对应的值指的是成员的变量所赋的值,该值所占用的内存空间大小,即为成员所占用的内存空间大小。对象类型成员指的是实例化对象,所引用的成员变量的赋值类型为引用类型的成员。子成员指的是该成员的变量所引用的成员。子成员所占用的内存空间大小即为该成员所占用的内存空间大小。如:实例化对象A(实例化对象A指的是一段代码)的变量c引用了成员d,当成员d的变量的赋值类型为值类型时,则该成员d的变量被赋的值所占用的内存空间大小,为成员d所占用的内存空间大小,当成员d的变量的赋值类型为引用类型时,确定成员d的变量所引用的成员的变量的赋值类型,为值类型时,将该变量所赋的值所占用的内存空间大小,为成员d所占用的内存空间大小,为引用类型时,继续查找,直至找到引用的成员的变量的赋值类型为值类型,将成员的变量所赋的值所占用的内存空间大小,为成员d所占用的内存空间大小。
在一个实施例中,基于实例化对象占用的内存值及实例化对象对应的对象引用链生成第三内存快照。
其中,内存快照指的是读取当前内存状态。在获得实例化对象占用的内存值,及实例化对象对应的对象引用链后,进行内存快照,生成第三内存快照。生成的第三内存快照是记录了实例化对象占用的内存值及实例化对象对应的对象引用链的文件。可供用户查看。
上述内存分析方法,通过接收内存分析指令,内存分析指令携带待分析程序标识;获取待分析程序标识对应的应用程序运行时内存中的对象;查找对象中的实例化对象,并确定实例化对象对应的赋值类型;根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值。可以具体确定出实例化对象占用的内存值,精确定位到内存的使用情况,在进行应用程序性能完善时,直接根据实例化对象占用的内存值,准确的找出需要完善的部分,提高了应用程序性能完善的效率。
在一个实施例中,如图3所示,该内存分析方法还包括如下步骤:
步骤S402,通过调用资源对象获取接口,获取应用程序的当前场景的资源对象。
其中,资源对象获取接口指的是用于获取应用程序的当前场景的资源对象的接口,该资源对象获取接口可以为多个接口,只要能获取到资源对象的接口都可看作是资源对象获取接口,如:Resource.FindObjectOfAllType(Object)。该当前场景指的是该应用程序所加载的进行显示的场景,该资源对象指的是当前场景内所有资源的内存对象,可以有多个资源对象,也可以只有一个资源对象,获取到的资源对象的个数,根据当前场景内所用的所有资源的对象确定,如:当前场景所用到的对象有5个,通过资源对象获取接口获取到的也将是5个资源对象。该资源可以是unity资源,unity资源具体包括贴图、材质、粒子、界面UI控件、网格资源等。具体地,资源对象可以是unity资源对象,unity资源对象的资源对象类型可以包括prefab对象、美术资源和hierarchy等等,prefab对象指应用程序运行后,加载到内存中的prefab的对象,prefab指的是unity的一类资源类型,它包含了多个unity资源,可重复在场景内使用,也可用于多个场景。美术资源指的是网格资源、贴图资源、粒子特效资源等美术资源等。Hierarchy指的是当前加载的对象中已经处于active状态(激活状态或运行状态)的unity对象。
在一个实施例中,将实例化对象占用的内存值在通过调用资源对象获取接口,获取应用程序的当前场景的资源对象之后,还包括:根据应用程序的当前场景是否可见,确定资源对象的资源对象类型。
其中,当资源对象为unity资源对象时,unity资源对象的资源对象类型包括prefab对象、美术资源和Hierarchy,可以根据美术资源的格式文件格式不同,在所有unity资源对象中区分出美术资源,对剩下的美术资源通过当前场景是否可见,确定资源对象是prefab对象还是Hierarchy,当前场景可见的是prefab对象,剩余的资源对象为Hierarchy。通过对资源对象的资源对象类型进行分类,在获得资源对象的内存分析结果后,根据资源对象的资源对象类型进行分类展示,便于进一步分析各类型的资源的内存占用情况。
步骤S404,通过调用资源内存获取接口,获取资源对象的实例标识,并获得实例标识对应的资源实例占用的内存值。
其中,资源内存获取接口指的是用于获取资源对象的实例标识的接口。实例标识指的是用于识别各实例的标识,该实例标识可以是该实例的id(资源标识符后接连字符以及字母与数字的唯一组合)。资源实例指的是该资源对象对应的实例,该实例在内存空间中所占用的内存大小为资源实例占用的内存值。
步骤S406,将实例标识对应的资源实例占用的内存值,确定为资源对象占用的内存值。
其中,该实例标识为资源对象对应实例的标识,该标识可以是该实例的id,id是用于识别各个实例的标记。各资源对象的id对应了一个实例,该实例在资源内存中所占用的内存空间大小即为资源对象占用的内存值。资源对象占用的内存值可以是Unity资源对象占用的内存值。
在一个实施例中,该内存分析方法,还包括:基于实例化对象占用的内存值、实例化对象对应的对象引用链以及资源对象占用的内存值生成第一内存快照。
其中,在获得实例化对象占用的内存值、实例化对象对应的对象引用链及资源对象占用的内存值后,进行内存快照,生成第一内存快照,生成的第一内存快照是记录了实例化对象占用的内存值、实例化对象对应的对象引用链及资源对象占用的内存值的文件。可供用户查看。可以生成多个内存快照的文件,如:生成一个包括各实例化对象占用的内存值及实例化对象对应的对象引用链的内容的内存快照的文件,和一个包括各资源对象占用的内存值的内容的内存快照的文件。也可以只生成一个内存快照的文件,如:内存快照的文件内容包括实例化对象占用的内存值、实例化对象对应的对象引用链及资源对象占用的内存值。生成的内存快照可以根据实例化对象占用的内存值的大小对实例化对象进行排序,获得排序后的内存快照。
在一个实施例中,该内存分析方法,还包括:基于实例化对象占用的内存值、实例化对象对应的对象引用链以及不同资源对象类型的资源对象占用的内存值生成第二内存快照。
其中,在获得实例化对象占用的内存值、实例化对象对应的对象引用链及不同资源对象类型的资源对象占用的内存值后,进行内存快照,生成第二内存快照,生成的第二内存快照是记录了实例化对象占用的内存值、实例化对象对应的对象引用链及不同资源对象类型的资源对象占用的内存值的文件。可供用户查看。生成第二内存快照之前,有对各资源对象根据资源对象类型进行分类,获得各资源对象的分类结果,生成第二内存快照时,可根据资源对象的分类结果对资源对象进行标记,在查看第二内存快照时能快速的所属的资源对象类型,显示第二内存快照时,还可以根据不同分类结果将资源对象用不同的页面进行显示,如:属于hierarchy的资源对象用一个页面显示,属于prefab对象的资源对象用一个页面显示,并对各页面设置相应的标识,可以获得hierarchy和prefab两部分的内存消耗,更精确查看unity资源内存的分布。如图4所示输出的分析结果图,图4所示所示的内容为其中一种内存快照的内容,例如:内存快照的内容包括对象的名称,该对象对应的类型名以及对应内存值(总大小),如:对象名称的内容为item(1-1-6)(new),对应的类型名内容为item(1-1-6)(GameObject--102620),则item对象对应的内存值为148.6MB。生成的内存快照可以根据如图4所示的排序方式,将各资源对象根据内存值的大小进行排序,如:根据资源对象的内存值从大到小顺序。上述实例化对象也可以根据内存值的大小进行排序,各个内存快照的文件可以根据内存值大小进行排序。
在一个实施例中,该内存分析方法还包括:获取不同时间点的内存快照,内存快照中的内容包括实例化对象占用的内存值、以及资源对象占用的内存值;对不同时间点的内存快照中的内容进行对比,获得各实例化对象和资源对象的内存变化信息。
其中,该内存快照可以是第一内存快照,也可以是第二内存快照。在不同时间分析出实例化对象占用的内存值及资源对象占用的内存值,并生成对应的内存快照,获得不同时间段的内存快照,通过对比不同时间的内存快照,获得各实例化对象的内存变化信息,可以根据内存变化信息快速分析出需要优化的模块。能快速定位到内存增长的原因,提升内存分析的效率。
如上所述的实施例中内存分析方法,可以通过独立的插件来实现,也可以嵌入在已有的性能分析工具中。以应用程序运行于mono虚拟机环境为例,该内存分析方法应用于mono环境的unity项目,例如可以嵌入在针对unity项目的游戏性能分析工具(unityProfiler工具,是unity编辑器自带的分析性能的工具)。以下以将内存分析方法嵌入在unity Profiler工具为例,结合一个具体的内存分析过程进行举例说明。
通过upackage包(upackage包指的是后缀名为upackage的代码包)导入游戏性能分析工具(如:unity Profiler工具)的代码。如图5所示的导入代码包界面,显示的是游戏性能分析工具的代码导入过程中的其中一个步骤,即:选择unity Profiler工具下的编辑栏,在编辑栏下选择CPU分析器栏,在CPU分析器栏下勾选分析数据导出器,其中,图5所示的界面内容为简化后的内容,并不限定导入代码包界面的显示内容。导入的代码进行编译后,在编辑器(为Unity编辑器)中添加一个unity插件,该unity插件用来对unity游戏的内存进行分析。unity插件添加完成后,如图6所示分析设置界面,显示的是在运行unity插件之前进行分析设置的其中一个步骤,即:在工具栏下,选择存储栏,在存储栏下选择默认堆快照,其中,图6所示的界面内容为简化后的内容,并不限定分析设置界面的显示内容。根据分析设置的内容在编辑器中运行unity插件,开始对对应的应用程序进行内存分析。
如图7所示,针对Mono内存模块的内存分析的步骤如下:
基于Unity开发的应用程序的Unity程序集加载到mono虚拟机后,通过mono虚拟机进行编译并运行,并为该应用程序分配对应的内存。通过mono虚拟机进行编译并运行后,可获得该应用程序运行时内存中生成的对象。
通过C#的反射接口,获取Unity程序集中实例化后的所有实例化对象及对象引用链,根据是否赋值判定各实例化对象是值类型还是引用类型,是值类型的实例化对象的内存值为该实例化对象的变量被赋的值的内存大小,是引用类型的实例化对象时,需要根据实例化对象的成员进一步转换,找到具体的值,将该值实例化对象作为该实例化对象的内存值。从而获得各实例化对象的内存值。
如图8所示,针对Unity资源内存模块的内存分析的步骤如下:
基于Unity开发的应用程序的Unity程序集,在mono虚拟机进行编译并运行时,所加载的当前场景,通过获取全部资源对象的资源对象获取接口(如:Resource.FindObjectOfAllType(Object))获取当前场景内全量unity资源对象(全量unity资源对象指的是所有的unity资源对象);并通过当前场景是否可见判定各unity资源对象中的hierarchy和prefab对象;通过资源内存获取接口获取各unity资源对象的资源实例id,各unity资源对象的资源实例id对应的资源实例占用的内存值,作为各unity资源对象对应的内存值;
其中对Mono内存模块的内存分析的步骤和Unity资源内存模块的内存分析的步骤同时进行,获得各实例化对象的内存值和各unity资源对象的内存值,基于各实例化对象的内存值和各unity资源对象的内存值进行内存快照,获得内存快照文件,内存快照文件的内容中,包括各实例化对象的对象名称、类型名及对应的内存值,及各unity资源对象的对象名称、类型名及对应内存值,及各实例化对象的对象引用链。
执行两次内存分析,该内存分析包括Mono内存模块的内存分析和Unity资源内存模块的内存分析,获得两次内存分析的内存快照,对两次的内存快照进行分析,获得各实例化对象和unity资源对象的内存变化信息,文本形式输出。能快速分析mono对象(实例化对象)的大小和unity资源对象的内存值,能快速定位到内存增长的原因,提升内存分析的效率,结果一目了然,可读性强,方便分析。
图2和图3为一个实施例中内存分析方法的流程示意图。应该理解的是,虽然图2和图3的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2和图3中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
如图9所示,一种内存分析装置,包括:指令接收模块310、对象获取模块320、实例化对象获取模块330及内存值分析模块340。
指令接收模块310,用于接收内存分析指令,内存分析指令携带待分析程序标识。
对象获取模块320,用于获取待分析程序标识对应的应用程序运行时内存中的对象。
实例化对象获取模块330,用于查找对象中的实例化对象,并确定实例化对象对应的赋值类型。
内存值分析模块340,用于根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值。
通过指令接收模块310接收内存分析指令,内存分析指令携带待分析程序标识;对象获取模块320获取获取待分析程序标识对应的应用程序运行时内存中的对象;实例化对象获取模块330查找对象中的实例化对象,并确定实例化对象对应的赋值类型;内存值分析模块340根据实例化对象对应的赋值类型,分析确定实例化对象占用的内存值。可以具体确定出实例化对象占用的内存值,精确定位到内存的使用情况,在进行应用程序性能完善时,直接根据实例化对象占用的内存值,准确的找出需要完善的部分,提高了应用程序性能完善的效率。
在一个实施例中,如图10所示,该内存分析装置还包括:
资源对象获取模块350,用于通过调用资源对象获取接口,获取应用程序的当前场景的资源对象。
实例标识获取模块360,用于通过调用资源内存获取接口,获取资源对象的实例标识,并获得实例标识对应的资源实例占用的内存值。
内存值确定模块370,用于将实例标识对应的资源实例占用的内存值,确定为资源对象占用的内存值。
在一个实施例中,对象获取模块320还用于:通过反射接口,获得待分析程序标识对应的应用程序运行时内存中的对象。
在一个实施例中,实例化对象获取模块330还用于:在对象有赋值时,确定对象为实例化对象;根据为对象赋值的赋值方式,确定实例化对象对应的赋值类型。
在一个实施例中,内存值分析模块340还用于:在赋值类型为值类型时,将实例化对象的值所占用的内存空间大小,作为实例化对象占用的内存值;在赋值类型为引用类型时,获取实例化对象引用的成员所占用的内存空间大小,并基于成员所占用的内存空间大小,确定实例化对象所占用的内存值。
在一个实施例中,内存值分析模块340还用于:在实例化对象引用的成员包括两个以上时,将各成员所占用的内存空间大小之和,作为实例化对象所占用的内存值。
在一个实施例中,内存值分析模块340还用于:在成员为值类型成员时,将值类型成员对应的值所占用的内存空间大小,作为成员所占用的内存空间大小;若成员为对象类型成员,根据对象类型成员对应的子成员所占用的内存空间大小,确定成员所占用的内存空间大小。
在一个实施例中,如图11所示,该内存分析装置还包括:对象引用链获取模块380,用于获取待分析程序标识对应的应用程序运行时内存中的对象时,还获取各对象的对象引用链。
在一个实施例中,如图11所示,该内存分析装置还包括:内存快照生成模块390,用于基于实例化对象占用的内存值、实例化对象对应的对象引用链以及资源对象占用的内存值生成第一内存快照。
在一个实施例中,如图11所示,该内存分析装置还包括:对象类型确定模块400,用于根据应用程序的当前场景是否可见,确定资源对象的资源对象类型。
在一个实施例中,内存快照生成模块390还用于:基于实例化对象占用的内存值、实例化对象对应的对象引用链以及不同资源对象类型的资源对象占用的内存值生成第二内存快照。
在一个实施例中,如图11所示,该内存分析装置还包括:
内存快照获取模块410,用于获取不同时间点的内存快照,所述内存快照中的内容包括实例化对象占用的内存值、以及资源对象占用的内存值;
内存快照对比模块420,用于对不同时间点的所述内存快照中的内容进行对比,获得各实例化对象和资源对象的内存变化信息。
图12示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端110。如图12所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现内存分析方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行内存分析方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图12中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,本申请提供的内存分析装置可以实现为一种计算机程序的形式,计算机程序可在如图12所示的计算机设备上运行。计算机设备的存储器中可存储组成该内存分析装置的各个程序模块,比如,图9所示的指令接收模块310、对象获取模块320、实例化对象获取模块330及内存值分析模块340。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的内存分析方法中的步骤。
例如,图12所示的计算机设备可以通过如图9所示的内存分析装置中的指令接收模块310执行步骤S202。计算机设备可通过对象获取模块320执行步骤S204。计算机设备可通过实例化对象获取模块330执行步骤S206。计算机设备可通过内存值分析模块340执行步骤S208。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述内存分析方法的步骤。此处内存分析方法的步骤可以是上述各个实施例的内存分析方法中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述内存分析方法的步骤。此处内存分析方法的步骤可以是上述各个实施例的内存分析方法中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

Claims (24)

1.一种内存分析方法,其特征在于,包括:
接收内存分析指令,所述内存分析指令携带待分析程序标识;
获取所述待分析程序标识对应的应用程序运行时内存中的对象;
查找所述对象中的实例化对象,并确定所述实例化对象对应的赋值类型;
在所述赋值类型为值类型时,将所述实例化对象的值所占用的内存空间大小,作为所述实例化对象占用的内存值;
在所述赋值类型为引用类型时,获取所述实例化对象引用的成员所占用的内存空间大小,并基于成员所占用的内存空间大小,确定所述实例化对象所占用的内存值。
2.根据权利要求1所述的方法,其特征在于,还包括步骤:
通过调用资源对象获取接口,获取所述应用程序的当前场景的资源对象;
通过调用资源内存获取接口,获取所述资源对象的实例标识,并获得所述实例标识对应的资源实例占用的内存值;
将所述实例标识对应的资源实例占用的内存值,确定为所述资源对象占用的内存值。
3.根据权利要求1所述的方法,其特征在于,所述获取所述待分析程序标识对应的应用程序运行时内存中的对象的步骤,包括:
通过反射接口,获得所述待分析程序标识对应的应用程序运行时内存中的对象。
4.根据权利要求1所述的方法,其特征在于,所述查找所述对象中的实例化对象,并确定所述实例化对象对应的赋值类型的步骤,包括:
在所述对象有赋值时,确定所述对象为实例化对象;
根据为所述对象的赋值方式,确定实例化对象对应的赋值类型。
5.根据权利要求1所述的方法,其特征在于,在所述实例化对象引用的成员包括两个以上时,基于成员所占用的内存空间大小,确定所述实例化对象所占用的内存值的步骤,包括:
将各成员所占用的内存空间大小之和,作为所述实例化对象所占用的内存值。
6.根据权利要求1所述的方法,其特征在于,还包括:
在成员为值类型成员时,将值类型成员对应的值所占用的内存空间大小,作为成员所占用的内存空间大小;
若成员为对象类型成员,根据对象类型成员对应的子成员所占用的内存空间大小,确定所述成员所占用的内存空间大小。
7.根据权利要求2所述的方法,其特征在于,还包括:
在获取所述待分析程序标识对应的应用程序运行时内存中的对象时,还获取各所述对象的对象引用链。
8.根据权利要求7所述的方法,其特征在于,还包括:
基于所述实例化对象占用的内存值、所述实例化对象对应的对象引用链以及所述资源对象占用的内存值生成第一内存快照。
9.根据权利要求2所述的方法,其特征在于,将实例化对象占用的内存值在所述通过调用资源对象获取接口,获取所述应用程序的当前场景的资源对象之后,还包括:
根据所述应用程序的当前场景是否可见,确定所述资源对象的资源对象类型。
10.根据权利要求9所述的方法,其特征在于,还包括:
基于所述实例化对象占用的内存值、所述实例化对象对应的对象引用链以及不同资源对象类型的资源对象占用的内存值生成第二内存快照。
11.根据权利要求8或10所述的方法,其特征在于,所述方法还包括:
获取不同时间点的内存快照,所述内存快照中的内容包括实例化对象占用的内存值、以及资源对象占用的内存值;
对不同时间点的所述内存快照中的内容进行对比,获得各实例化对象和资源对象的内存变化信息。
12.一种内存分析装置,其特征在于,包括:
指令接收模块,用于接收内存分析指令,所述内存分析指令携带待分析程序标识;
对象获取模块,用于获取所述待分析程序标识对应的应用程序运行时内存中的对象;
实例化对象获取模块,用于查找所述对象中的实例化对象,并确定所述实例化对象对应的赋值类型;
内存值分析模块,用于在所述赋值类型为值类型时,将所述实例化对象的值所占用的内存空间大小,作为所述实例化对象占用的内存值;在所述赋值类型为引用类型时,获取所述实例化对象引用的成员所占用的内存空间大小,并基于成员所占用的内存空间大小,确定所述实例化对象所占用的内存值。
13.根据权利要求12所述的装置,其特征在于,还包括:
资源对象获取模块,用于通过调用资源对象获取接口,获取所述应用程序的当前场景的资源对象;
实例标识获取模块,用于通过调用资源内存获取接口,获取所述资源对象的实例标识,并获得所述实例标识对应的资源实例占用的内存值;
内存值确定模块,用于将所述实例标识对应的资源实例占用的内存值,确定为所述资源对象占用的内存值。
14.根据权利要求12所述的装置,其特征在于,所述对象获取模块还用于:通过反射接口,获得所述待分析程序标识对应的应用程序运行时内存中的对象。
15.根据权利要求12所述的装置,其特征在于,所述实例化对象获取模块还用于:
在所述对象有赋值时,确定所述对象为实例化对象;
根据为所述对象的赋值方式,确定实例化对象对应的赋值类型。
16.根据权利要求12所述的装置,其特征在于,所述内存值分析模块还用于:
在所述实例化对象引用的成员包括两个以上时,将各成员所占用的内存空间大小之和,作为所述实例化对象所占用的内存值。
17.根据权利要求12所述的装置,其特征在于,所述内存值分析模块还用于:
在成员为值类型成员时,将值类型成员对应的值所占用的内存空间大小,作为成员所占用的内存空间大小;
若成员为对象类型成员,根据对象类型成员对应的子成员所占用的内存空间大小,确定所述成员所占用的内存空间大小。
18.根据权利要求13所述的装置,其特征在于,还包括对象引用链获取模块,用于:
在获取所述待分析程序标识对应的应用程序运行时内存中的对象时,还获取各所述对象的对象引用链。
19.根据权利要求18所述的装置,其特征在于,还包括内存快照生成模块,用于:
基于所述实例化对象占用的内存值、所述实例化对象对应的对象引用链以及所述资源对象占用的内存值生成第一内存快照。
20.根据权利要求13所述的装置,其特征在于,还包括对象类型确定模块,用于:
根据所述应用程序的当前场景是否可见,确定所述资源对象的资源对象类型。
21.根据权利要求20所述的装置,其特征在于,还包括内存快照生成模块,用于:
基于所述实例化对象占用的内存值、所述实例化对象对应的对象引用链以及不同资源对象类型的资源对象占用的内存值生成第二内存快照。
22.根据权利要求19或21所述的装置,其特征在于,还包括:
内存快照获取模块,用于获取不同时间点的内存快照,所述内存快照中的内容包括实例化对象占用的内存值、以及资源对象占用的内存值;
内存快照对比模块,用于对不同时间点的所述内存快照中的内容进行对比,获得各实例化对象和资源对象的内存变化信息。
23.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如权利要求1至11中任一项所述方法的步骤。
24.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如权利要求1至11中任一项所述方法的步骤。
CN201910535526.2A 2019-06-20 2019-06-20 内存分析方法、装置和计算机可读存储介质 Active CN110231994B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910535526.2A CN110231994B (zh) 2019-06-20 2019-06-20 内存分析方法、装置和计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910535526.2A CN110231994B (zh) 2019-06-20 2019-06-20 内存分析方法、装置和计算机可读存储介质

Publications (2)

Publication Number Publication Date
CN110231994A CN110231994A (zh) 2019-09-13
CN110231994B true CN110231994B (zh) 2024-03-12

Family

ID=67856249

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910535526.2A Active CN110231994B (zh) 2019-06-20 2019-06-20 内存分析方法、装置和计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN110231994B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110737434B (zh) * 2019-09-29 2022-12-06 苏州浪潮智能科技有限公司 一种对象实例化的方法及装置
CN112860590A (zh) * 2019-11-28 2021-05-28 北京沃东天骏信息技术有限公司 一种图片分析方法和装置
CN111858339B (zh) * 2020-07-22 2023-11-28 腾讯科技(成都)有限公司 内存分析方法、设备和系统以及计算设备、计算机可读存储介质
CN111858258A (zh) * 2020-07-29 2020-10-30 浪潮电子信息产业股份有限公司 一种内存监控方法、装置及电子设备和存储介质
CN112052158B (zh) * 2020-08-05 2022-09-30 腾讯科技(成都)有限公司 美术资源运行信息采集方法和装置
CN111782555A (zh) * 2020-08-17 2020-10-16 网易(杭州)网络有限公司 闭包对象的分析方法、装置、电子设备及计算机可读介质
CN113157455A (zh) * 2021-04-27 2021-07-23 腾讯科技(深圳)有限公司 内存管理方法、装置、电子设备及计算机可读存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108845934A (zh) * 2018-05-24 2018-11-20 深圳市腾讯网络信息技术有限公司 内存泄漏源的定位方法和装置、存储介质、电子装置
CN109063210A (zh) * 2018-09-25 2018-12-21 郑州云海信息技术有限公司 存储系统的资源对象查询方法、装置、设备及存储介质
CN109582595A (zh) * 2018-12-12 2019-04-05 上海达梦数据库有限公司 内存管理方法、装置、服务器及存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8504878B2 (en) * 2010-05-04 2013-08-06 Oracle International Corporation Statistical analysis of heap dynamics for memory leak investigations

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108845934A (zh) * 2018-05-24 2018-11-20 深圳市腾讯网络信息技术有限公司 内存泄漏源的定位方法和装置、存储介质、电子装置
CN109063210A (zh) * 2018-09-25 2018-12-21 郑州云海信息技术有限公司 存储系统的资源对象查询方法、装置、设备及存储介质
CN109582595A (zh) * 2018-12-12 2019-04-05 上海达梦数据库有限公司 内存管理方法、装置、服务器及存储介质

Also Published As

Publication number Publication date
CN110231994A (zh) 2019-09-13

Similar Documents

Publication Publication Date Title
CN110231994B (zh) 内存分析方法、装置和计算机可读存储介质
CN111506498B (zh) 测试用例的自动生成方法、装置、计算机设备及存储介质
CN108287694B (zh) 应用程序构建方法、系统、计算机设备和存储介质
CN110209652B (zh) 数据表迁移方法、装置、计算机设备和存储介质
CN108459964B (zh) 测试用例选择方法、装置、设备以及计算机可读存储介质
CN114546738B (zh) 服务器通用测试方法、系统、终端及存储介质
CN111026647B (zh) 代码覆盖率的获取方法、装置、计算机设备和存储介质
CN113672375B (zh) 资源分配预测方法、装置、设备及存储介质
CN113127347A (zh) 一种接口测试方法、装置、设备及可读存储介质
CN112380130A (zh) 基于调用依赖关系的应用测试方法和装置
CN112860312A (zh) 项目依赖关系变化的检测方法及装置
CN110955434B (zh) 软件开发包处理方法、装置、计算机设备和存储介质
CN111124872A (zh) 基于差异代码分析的分支检测方法、装置及存储介质
US8769498B2 (en) Warning of register and storage area assignment errors
CN112905451A (zh) 应用程序的自动化测试方法及装置
CN110716866A (zh) 代码质量扫描方法、装置、计算机设备及存储介质
CN113805861B (zh) 基于机器学习的代码生成方法、代码编辑系统及存储介质
CN115757172A (zh) 测试执行方法、装置、存储介质及计算机设备
CN113821193B (zh) 一种信息生成的方法、装置和存储介质
CN113730917A (zh) 游戏脚本生成方法、装置、计算机设备和存储介质
CN108563578A (zh) Sdk兼容性检测方法、装置、设备及可读存储介质
CN114296774A (zh) 一种应用程序的存储方法、调用方法、装置及存储介质
CN113485919A (zh) 测试方法、测试装置及计算机可读存储介质
CN114691496A (zh) 单元测试方法、装置、计算设备及介质
CN108874468B (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