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

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

【技术实现步骤摘要】
内存分析方法、设备和系统以及计算设备、计算机可读存储介质
本专利技术涉及计算机领域,更具体地涉及一种内存分析方法、设备和系统,以及一种计算设备和计算机可读存储介质。
技术介绍
随着诸如智能手机和平板电脑之类的移动终端设备的普及,手机类应用和游戏得到快速发展。在手机应用或游戏的开发过程中,优化手机应用或游戏在运行时占用的内存、降低内存占用率受到手机应用开发人员的关注。因为,若游戏运行过程中占用内存过多,可能会被操作系统认定为异常进程而直接关闭,也可能会因占用过多导致系统内存,使得系统性能降低,从而令游戏体验下降。然而,在当前的手机引用和游戏开发和测试过程中,以Unity应用和游戏开发引擎结合Mono编译工具平台为例,由于无法获取到Mono托管的内存堆中详细的对象和内存使用情况,因此想要优化Mono内存是十分困难的,往往只能通过开发的经验来尝试性优化。同时,随着手机游戏应用程序的复杂程度不断提高,其开发过程中不可避免地出现内存泄露的情况。对于Mono的内存泄漏等问题,相关技术无法得知内存泄漏的本质原因。
技术实现思路
本专利技术的目的是克服相关技术的缺陷中至少一种。根据本专利技术的一个方面,提供了一种内存分析方法,包括:接收针对目标应用的内存分析请求;响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;根据第一类对象的第一引用关系信息,获取内存中的第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。在一些实施例中,第一类对象的第一引用关系信息包括第一类对象中各对象的名称和各对象之间的引用路径;第二类对象中的静态对象包括静态变量和静态类。在一些实施例中,第二类对象中静态对象的第二引用关系信息包括该静态对象的元信息、该静态对象直接和/或间接引用的对象的元信息、引用路径。在一些实施例中,静态对象的元信息包括:该静态对象的名称、类型、字段、对象值和内存占用的大小中至少一个,所述静态对象直接和间接引用的对象的元信息包括所述静态对象直接和/或间接引用的对象的名称、类型、字段、对象值和内存占用的大小中至少一个。在一些实施例中,查找编译工具程序域中的静态类集合,以获取静态类集合中每一个静态类的元信息;基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,其中每一个静态类的引用链为树状结构,根节点为该静态类,其余各节点都是其父节点的直接引用对象,叶节点为没有直接引用对象的对象;根据所述静态类集合中每一个静态类的引用链,确定第二类对象中的静态对象的第二引用关系信息;其中,所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,包括:在递归查找直接引用对象的过程中,判断当前查找到的直接引用对象是否属于第二类对象;响应于当前查找到的直接引用对象不属于第二类对象,通过自定义接口从目标应用的引擎访问第一类对象的第一引用关系信息以实现针对所述当前查找到的直接引用对象的后续递归查找。在一些实施例中,所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链包括:初始化步骤:将每一个静态类作为引用链的根节点并设定为当前对象;直接引用关系判断步骤:根据当前对象的元信息,判断当前对象是否存在直接引用对象;引用链节点确定步骤:响应于当前对象存在直接引用对象,获取该直接引用对象的元信息并将该直接引用对象作为当前对象的子节点;递归循环步骤:在获取所述直接引用对象元信息之后,将所述直接引用对象作为当前对象,转到直接引用关系判断步骤;循环结束步骤:响应于当前对象不存在直接引用对象,结束引用链获取。在一些实施例中,引用链节点确定步骤包括:根据当前对象的元信息,确定当前对象中成员变量的类型;响应于当前对象的成员变量为数组类型变量,则从内存中存储的该数组的首地址所指向的元素开始,依序遍历该数组的每个元素,从而获得每个元素所引用的对象的元信息,作为直接引用对象的元信息;响应于当前对象的成员变量为字符串类型变量,则根据内存中存储的该字符串的首地址所指向的字符串对象,来获取该字符串对象的元信息,作为直接引用对象的元信息;响应于当前对象的成员变量为类类型变量,则根据内存中存储的该类类型变量所指向的类对象的首地址,依序遍历该类对象中的每个成员变量,从而获得该类对象的元信息,作为直接引用对象的元信息。在一些实施例中,根据本专利技术的内存分析方法进一步包括:根据第一类对象的第一引用关系信息和第二类对象中静态对象的第二引用关系信息,生成目标应用的第二内存快照文件。在一些实施例中,根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件,包括:将第二类对象中静态对象的第二引用关系信息序列化,以形成目标应用的第一内存快照文件。在一些实施例中,根据本专利技术的内存分析方法进一步包括:将第一内存快照文件发送至服务器以供服务器通过反序列化解析还原并展示第二类对象中静态对象的第二引用关系信息。在一些实施例中,应用引擎包括Unity引擎,所述编译工具包括Mono。根据本专利技术的另一方面,提供另一种内存分析方法,包括:接收针对目标应用的内存分析请求;响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;根据第一类对象的第一引用关系信息,获取内存中的第二类对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;根据第二类对象的第二引用关系信息,生成目标应用的第三内存快照文件。在根据本专利技术的另一种内存分析方法中,第二类对象的第二引用关系信息包括第二类对象中每一个对象的元信息、以及其直接引用的第二类对象或第一类对象中对象的元信息。根据本专利技术的又一个方面,提供一种内存分析设备,包括:接收模块,其配置成接收针对目标应用的内存分析请求;第一获取模块,其配置成响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;第二获取模块,其配置成根据第一类对象的第一引用关系信息,获取内存中第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;生成模块,其配置成根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。根据本专利技术的另一方面,提供一种内存分析系统,包括内存分析设备和内存分析服务器,其中内存分析设备包括:第一接收模块,其配置成从内存分析服务器接收针对目标应用的内存分析请求;第一获取模块,其配置成响应于目标应用的分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用本文档来自技高网...

【技术保护点】
1.一种内存分析方法,包括:/n接收针对目标应用的内存分析请求;/n响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;/n根据第一类对象的第一引用关系信息,获取内存中的第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;/n根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。/n

【技术特征摘要】
1.一种内存分析方法,包括:
接收针对目标应用的内存分析请求;
响应于所述内存分析请求,在目标应用运行时获取内存中第一类对象的第一引用关系信息,第一类对象为目标应用的原生对象的集合;
根据第一类对象的第一引用关系信息,获取内存中的第二类对象中静态对象的第二引用关系信息,第二类对象为目标应用的编译工具程序域中的对象的集合;
根据第二类对象中静态对象的第二引用关系信息,生成目标应用的第一内存快照文件。


2.根据权利要求1所述的方法,其中第一类对象的第一引用关系信息包括第一类对象中各对象的名称和各对象之间的引用路径;第二类对象中的静态对象包括静态变量和静态类。


3.根据权利要求2所述的方法,第二类对象中静态对象的第二引用关系信息包括该静态对象的元信息、该静态对象直接和/或间接引用的对象的元信息、引用路径。


4.根据权利要求3所示的方法,其中所述静态对象的元信息包括:该静态对象的名称、类型、字段、对象值和内存占用的大小中至少一个,所述静态对象直接和间接引用的对象的元信息包括所述静态对象直接和/或间接引用的对象的名称、类型、字段、对象值和内存占用的大小中至少一个。


5.根据权利要求3所述的方法,其中所述根据第一类对象的第一引用关系信息,获取内存中第二类对象中的静态对象的第二引用关系信息包括:
查找编译工具程序域中的静态类集合,以获取静态类集合中每一个静态类的元信息;
基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,其中每一个静态类的引用链为树状结构,根节点为该静态类,其余各节点都是其父节点的直接引用对象,叶节点为没有直接引用对象的对象;
根据所述静态类集合中每一个静态类的引用链,确定第二类对象中的静态对象的第二引用关系信息;
其中,所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链,包括:
在递归查找直接引用对象的过程中,判断当前查找到的直接引用对象是否属于第二类对象;
响应于当前查找到的直接引用对象不属于第二类对象,通过自定义接口从目标应用的引擎访问第一类对象的第一引用关系信息以实现针对所述当前查找到的直接引用对象的后续递归查找。


6.根据权利要求5所述的方法,其中所述基于第一类对象的第一引用关系信息和每一个静态类的元信息,通过从该静态类开始递归查找直接引用对象获取静态类集合中每一个静态类的引用链包括:
初始化步骤:将每一个静态类作为引用链的根节点并设定为当前对象;
直接引用关系判断步骤:根据当前对象的元信息,判断当前对象是否存在直接引用对象;
引用链节点确定步骤:响应于当前对象存在直接引用对象,获取该直接引用对象的元信息并将该直接引用对象作为当前对象的子节点;
递归循环步骤:在获取所述直接引用对象元信息之后,将所述直接引用对象作为当前对象,转到所述直接引用关系判断步骤;
循环结束步骤:响应于当前对象不存在直接引用对象,结束引用链获取。


7.根据权利要求6所述的方法,其中所述引用链节点确定步骤包括:
根据当前对象的元信息,确定当前对象中成员变量的类型;
响应于当前对象的成员变量为数组类型变量,则从内存中存储的该数组的首地址所指向的元素开始,依序遍历该数组的每个元素,从而获得每个元素所引用的对象的元信息,作为直接引用对象的元信息;
响应于当前对象的成员变量为字符串类型变量,则根据内存中存储的该字符串的首地址所指向的字符串对象,来获...

【专利技术属性】
技术研发人员:徐睿祺楚培林陈强陈瑞坤李凤兰
申请(专利权)人:腾讯科技成都有限公司
类型:发明
国别省市:四川;51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1