CN107992429A - 一种内存对象引用关系确定方法及装置 - Google Patents
一种内存对象引用关系确定方法及装置 Download PDFInfo
- Publication number
- CN107992429A CN107992429A CN201610969849.9A CN201610969849A CN107992429A CN 107992429 A CN107992429 A CN 107992429A CN 201610969849 A CN201610969849 A CN 201610969849A CN 107992429 A CN107992429 A CN 107992429A
- Authority
- CN
- China
- Prior art keywords
- memory
- memory object
- image information
- value
- time point
- 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
Links
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/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Image Processing (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种内存对象引用关系确定方法及装置,本申请能够获取目标应用运行过程中,目标时间点的内存快照信息,内存快照信息包含了内存对象的值和地址,进而基于A内存对象引用B内存对象时,A内存对象的值包含B内存对象的地址的原则,将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。通过确定各内存对象间的引用关系,可以帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
Description
技术领域
本申请涉及内存检测技术领域,更具体地说,涉及一种内存对象引用关系确定方法及装置。
背景技术
随着互联网技术的发展,各种类型的应用也如雨后春笋般出现,为用户提供了多样化的网络业务,如视频业务、游戏业务、网络直播业务等等,极大的丰富了用户的生活。
应用在运行过程中会动态申请内存空间,且随着应用进程的运行,已申请的内存空间如果不再使用时应该及时进行释放,避免应用内存无限增长,导致内存泄漏。对于内存对象而言,如果其被其它内存对象所引用,则该内存对象将无法被垃圾回收机制GC所销毁。也即,被引用住的内存对象无法被销毁。对于市面上的大多数应用而言,由于编写代码不完善,可能会存在某些内存对象间引用关系不能及时取消,导致内存对象无法及时销毁。
因此,现有技术亟需一种内存对象引用关系确定方案,以检测内存对象间的引用关系,帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
发明内容
有鉴于此,本申请提供了一种内存对象引用关系确定方法及装置,以实现对内存对象引用关系的检测,方便开发人员针对性的进行代码优化。
为了实现上述目的,现提出的方案如下:
一种内存对象引用关系确定方法,包括:
启动终端装载的目标应用;
获取所述目标应用在运行过程中,目标时间点的内存快照信息,其中所述内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息,所述属性信息包括内存对象的地址;
将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
一种内存对象引用关系确定装置,包括:
应用启动单元,用于启动终端装载的目标应用;
内存快照获取单元,用于获取所述目标应用在运行过程中,目标时间点的内存快照信息,其中所述内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息信息,所述属性信息包括内存对象的地址;
引用关系确定单元,用于将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
本申请实施例提供的内存对象引用关系确定方法包括:启动终端装载的目标应用;获取所述目标应用在运行过程中,目标时间点的内存快照信息,其中所述内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息,所述属性信息包括内存对象的地址;将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。由此可知,本申请能够获取目标应用运行过程中,目标时间点的内存快照信息,内存快照信息包含了内存对象的值和地址,进而基于A内存对象引用B内存对象时,A内存对象的值包含B内存对象的地址的原则,将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。通过确定各内存对象间的引用关系,可以帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请示例的一种实施环境架构示意图;
图2为本申请实施例提供的一种服务器硬件结构示意图;
图3为本申请实施例公开的一种内存对象引用关系确定方法流程图;
图4示例了一种客户端启动终端应用的界面示意图;
图5示例了一种内存快照信息列表下载界面示意图;
图6为本申请实施例公开的另一种内存对象引用关系确定方法流程图;
图7为本申请实施例示例的一种内存占用随时间变化曲线示意图;
图8为本申请实施例公开的一种获取内存快照信息方法流程图;
图9示例了游戏应用界面展示第一控件示意图;
图10为对mono平台开发的目标应用获取内存快照信息的逻辑架构示意图;
图11为本申请实施例公开的一种内存对象地址匹配方法流程图;
图12为本申请实施例示例的一个内存对象地址匹配示意图;
图13为本申请实施例公开的另一种内存对象地址匹配方法流程图;
图14示例一种内存对象间多层引用关系示意图;
图15为本申请实施例公开的一种内存对象引用关系确定装置结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提供了一种内存对象引用关系确定方法,能够在目标应用运行过程,获取目标时间点的内存快照信息,内存快照信息包含了内存对象的值和地址,进而基于A内存对象引用B内存对象时,A内存对象的值包含B内存对象的地址的原则,将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。通过确定各内存对象间的引用关系,可以帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
实施环境
参照图1,图1为本申请示例的一种实施环境架构示意图。
如图1所示,包括:客户端10和服务器11。
其中,客户端10运行于终端设备中,终端设备可以是手机、PC电脑等。终端设备可以运行目标应用。本申请通过客户端获取目标应用运行过程中,目标时间点的内存快照信息。
服务器11可以是一台服务器,或者由若干台服务器组成的服务器群,或者是一个云计算服务中心。
本申请中服务器可以对客户端获取的内存快照信息进行分析,确定内存快照信息中各内存对象间的引用关系。服务器可以存储该引用关系,并能够支持用户查询、浏览引用关系。
客户端10和服务器11可以通过有线网络或者无线网络通信。
进一步可选的,本申请的实时环境架构也可以仅设置客户端10而不设置服务器11,客户端10运行于终端设备上,能够获取目标应用运行过程中,目标时间点的内存快照信息。进一步,客户端可以对内存快照信息进行分析,确定内存快照信息中各内存对象间的引用关系。工作人员可以在客户端上查询、浏览内存对象间的引用关系。
计算机架构
参照图2,图2为本申请实施例提供的一种服务器硬件结构示意图。
如图2所示,服务器可以包括:
处理器1,通信接口2,存储器3,通信总线4,和显示屏5;
其中处理器1、通信接口2、存储器3和显示屏5通过通信总线4完成相互间的通信;
可选的,通信接口2可以为通信模块的接口,如GSM模块的接口;
处理器1,用于执行程序;
存储器3,用于存放程序;
程序可以包括程序代码,所述程序代码包括处理器的操作指令。
处理器1可能是一个中央处理器CPU,或者是特定集成电路ASIC(ApplicationSpecific Integrated Circuit),或者是被配置成实施本申请实施例的一个或多个集成电路。
存储器3可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。
本案发明人发现,以手机端的游戏应用为例,工作人员可以将客户端注入手机中,由客户端启动游戏应用,并在游戏运行过程获取目标时间点的内存快照信息,将内存快照信息发送给服务器。服务器可以确定内存快照信息中各内存对象间的引用关系。可以帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
接下来,通过几个示意性实施例对本申请技术方案进行介绍和说明。
首先,本申请实施例公开了一种内存对象引用关系确定系统,包括内存快照获取模块和内存快照分析模块,其中:
所述内存快照获取模块用于,启动终端装载的目标应用;获取所述目标应用在运行过程中,目标时间点的内存快照信息,其中所述内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息,所述属性信息包括内存对象的地址;将获取的所述内存快照信息发送至所述内存快照分析模块;
所述内存快照分析模块用于,将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
可以理解的是,内存快照获取模块可以运行于上述的客户端10,内存快照分析模块可以运行于上述的服务器11中。当然,内存快照分析模块也可以运行于上述的客户端10,具体分配方式可以根据需要设设定。
通过内存快照获取模块及内存快照分析模块配合,实现对内存快照信息中各内存对象间引用关系的确定,帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
进一步地,本申请实施例对内存对象引用关系确定方法实施过程进行介绍,参见图3,图3为本申请实施例公开的一种内存对象引用关系确定方法流程图。
如图3所示,该方法包括:
步骤S100、启动终端装载的目标应用;
具体地,为了检测终端上目标应用运行过程内存占用情况,本申请可以将预先开发的客户端注入终端中。通过该客户端可以启动终端上所要运行的目标应用。
参见图4,图4示例了一种客户端启动终端应用的界面示意图。其中,在启动终端应用的界面10中,提供有选择所要启动的应用的功能栏11。图4示例的启动的目标应用为游戏应用“穿越火线”。进一步,在该界面中还提供了测试选项栏,工作人员可以选择其中“内存检测”12一栏,以进行内存检测。
步骤S110、获取所述目标应用在运行过程中,目标时间点的内存快照信息;
其中,目标时间点可以是多个,各目标时间点的内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息,该属性信息至少包括内存对象的地址。内存对象的值即为内存对象在地址中所存储的数值。
具体地,获取内存快照信息的目标时间点可以由用户指定,例如在目标应用运行过程中,用户可以在任意时间点发起获取内存快照信息的指令。除此之外,本申请客户端还可以根据其它策略确定获取内存快照信息的目标时间点。
目标应用在运行过程中,随着场景变化以及进程运行,过程中会产生大量的内存对象,同时已产生的内存对象也存在被销毁的。不同时间点所保留下来的内存对象也可能不同。因此,对于获取的目标时间点对应的内存快照信息,其包含了自目标应用启动时刻至该目标时间点之间,所有已生成且未被销毁的内存对象信息。
可选的,内存对象的属性信息还可以包括内存对象的大小、类型、堆栈等信息。
步骤S120、将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
具体地,由于目标时间点可以是多个,因此获取的内存快照信息可以是一个或多个。本步骤中需要指定需要匹配内存对象引用关系的内存快照信息,该指定方式可以是由工作人员指定,或者是由客户端采用其它策略指定。
参见图5,图5示例了一种内存快照信息列表下载界面示意图。由图5可以看出,图5示例的内存快照信息列表下载界面20中展示有各目标时间点对应的内存快照信息标识,同时提供了下载链接。用户可以从中选择需要匹配内存对象引用关系的内存快照信息。
本步骤中,基于A内存对象引用B内存对象时,A内存对象的值包含B内存对象的地址的原则,将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。通过确定各内存对象间的引用关系,可以帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
在本申请的另一个实施例中,公开了另一种内存对象引用关系确定方法,参见图6。
如图6所示,该方法包括:
步骤S200、启动终端的目标应用;
具体地,为了检测终端上目标应用运行过程内存占用情况,本申请可以将预先开发的客户端注入终端中。通过该客户端可以启动终端上所要运行的目标应用。
步骤S210、获取所述目标应用在运行过程中,目标时间点的内存快照信息;
其中,目标时间点可以是多个,各目标时间点的内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息,该属性信息至少包括内存对象的地址。内存对象的值即为内存对象在地址中所存储的数值。
步骤S220、在所述目标应用运行过程中,每隔设定检测周期统计已生成且未被销毁的所有内存对象大小和值,保存为各检测周期的内存占用值;
具体地,检测周期可以设置为1s或者其它时间。统计每一时刻已生成且未被销毁的所有内存对象大小和值,并记录。
步骤S230、利用各检测周期的内存占用值,绘制内存占用随时间变化的曲线图;
步骤S240、在所述曲线图中标记各所述目标时间点的内存占用值;
参见图7,图7为本申请实施例示例的一种内存占用随时间变化曲线示意图。图7中,示例了各时刻内存占用情况。其中,snapshot1、snapshot2、snapshot3为获取的三个内存快照信息的目标时间点对应的内存占用情况。
通过时间点标记,以便用户根据各目标时间点在所述曲线图中的内存占用值,确定所要匹配对象引用关系的内存快照信息。
图7中进一步标记了目标应用在不同场景间切换的时间点,其中“Loading”代表进入一个场景,“GameFrontEnd”代表退出一个场景。通过进入和退出场景时间点的标记,更加便于工作人员确定所要对比的目标内存快照信息对。举例如,工作人员可以选择进入场景时和退出场景时的两个内存快照信息,作为对比对象。
步骤S250、展示多个目标时间点对应的内存快照信息;
具体地,展示界面可以参照图5所示。
步骤S260、将用户指定的内存快照信息作为目标内存快照信息;
具体地,用户可以参考图7示例的曲线,选择所要匹配内存对象引用关系的内存快照信息。
步骤S270、将所述目标内存快照信息中每一内存对象的值,与目标内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
相比于上述实施例,本实施例中进一步增加了对目标应用运行过程各时刻内存占用情况的统计,进而绘制内存占用随时间变化曲线图,并在所述曲线图中标记各所述目标时间点的内存占用值,以便工作人员根据各内存快照信息对应目标时间点在所述曲线图中的内存占用值,确定所要匹配内存对象引用关系的的目标内存快照信息。
在本申请的另一个实施例中,对上述步骤中,获取所述目标应用在运行过程中,目标时间点对应的内存快照信息的过程进行介绍。参见图8。
如图8所示,该过程可以包括:
步骤S300、Hook所述目标应用提供的内存对象生成函数以及内存对象销毁函数;
其中,Hook(钩子)是一个处理消息的程序段,可以对Hook的对象进行监控。这里,本申请Hook目标应用所提供的所有内存对象生成函数,以及内存对象销毁函数,实时监控各函数的动作。
步骤S310、在监控到所述内存对象生成函数生成内存对象时,获取生成的内存对象的值和属性信息,并存入目标文件;
具体地,目标应用在运行过程中需要生成内存对象时需要调用内存对象生成函数。本申请在监控到内存对象生成函数生成内存对象时,获取到该内存对象的属性信息,同时,获取该生成的内存对象的值,一并存入指定的目标文件中。
其中,内存对象的属性信息可以包括内存大小的地址、类型、大小、堆栈信息等。
通过本步骤的操作,所有生成的内存对象的值和属性信息都记录在目标文件中。
步骤S320、在监控到所述内存对象销毁函数销毁已生成的内存对象时,将所述目标文件中已销毁的内存对象的值和属性数据删除;
具体地,当目标应用需要销毁一个内存对象时,需要调用内存对象销毁函数。本申请在监控到所述内存对象销毁函数销毁已生成的内存对象时,将所述目标文件中已销毁的内存对象的值和属性数据删除。
通过本步骤的操作,保证目标文件中不会存在被销毁后的内存对象的值和属性数据。
步骤S330、在收到内存快照获取指令时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件,复制文件保存为当前时间点对应的内存快照信息。
具体地,若某一时刻客户端收到内存快照获取指令,则将当前时间点作为目标时间点,客户端通过对当前时刻目标文件进行复制,得到复制文件,该复制文件保存为当前时间点对应的内存快照信息。
可选的,上述步骤S330中,接收内存快照获取指令的方式可以有多种,举例如:
第一:目标应用运行过程中,在终端屏幕上维持显示第一控件。客户端在检测到用户触发该第一控件时,表示接收到内存快照获取指令。
参见图9,图9示例在在目标应用为“王者荣耀”游戏应用时,在应用运行界面展示有一透明浮窗30,该浮窗中提供有“内存快照”控件,工作人员可以在任意时间点击该控件,以下发获取内存快照指令。
第二:客户端在检测到所述目标应用运行至指定场景时,表示接收到内存快照获取指令。
具体地,本申请可以预先指定场景,目标应用运行至指定场景的时间点即为需要获取内存快照信息的目标时间点。举例如,一款游戏应用在进入一个战斗场景时,获取内存快照信息,以及,游戏应用在退出一个战斗场景时,获取内存快照信息。
需要解释的是,现有运行于移动终端的应用大部分都是基于unity引擎所开发。而unity引擎是在mono平台上使用C#语言开发应用。基于此,本申请对基于mono平台开发的目标应用的内存快照信息获取过程进行介绍。
参见图10,图10为对mono平台开发的目标应用获取内存快照信息的逻辑架构示意图。
如图10所示,本申请可以将内存检测程序注入目标应用所在的终端。在启动目标应用之后,内存检测程序会调用Libmono.so接口,通过Libmono.so所提供的各种函数监控内存对象的生成和销毁。同时,通过Libmono.so所提供的各种函数获取生成的C#内存对象的属性信息。该C#内存对象的属性信息可以包括:GC时间数据、函数时间数据、mono内存数据、地址数据等。将C#内存对象的属性信息写入目标文件。通过还可以获取C#内存对象的值,将值也写入目标文件。在收到内存快照信息获取指令时,对目标文件进行复制,得到该时间点对应的内存快照信息。
可选的,上述Libmono.so所提供的监控内存对象的生成和销毁的函数包含但不限于以下几种:
监控C#对象生成时的函数包括:
mono_object_new_alloc_specific()
mono_object_clone()
mono_array_new_full()
mono_array_new_specific()
mono_string_new_size()
mono_value_box()
监控C#对象是否销毁判断函数:
mono_object_is_alive
再进一步的,上述调用libmono.so接口获取所述C#内存对象的属性信息的过程可以包括:
通过libmono.so接口所提供的mono_object_get_size函数获取所述C#内存对象的大小;
通过libmono.so接口所提供的mono_object_get_class函数获取所述C#内存对象的类型;
通过libmono.so接口所提供的mono_stack_walk_no_il函数获取所述C#内存对象的堆栈。
当然,上述仅仅介绍了基于mono平台开发的目标应用的内存快照信息获取过程。对于其它类型的目标应用,可以采用目标应用所提供的内存分配函数、GC回收函数来获取内存对象的属性信息。
在本申请的又一个实施例中,对上述步骤S120,将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系的过程进行介绍,参见图11。
如图11所示,该方法包括:
步骤S400、以地址所占内存大小为单位,对所述内存快照信息中每一内存对象的值进行划分,每一内存对象的值划分为若干子值;
具体地,内存对象的地址所占内存是一个固定的量,一般为4个字节。本申请以地址所占内存大小为单位,对所述内存快照信息中每一内存对象的值进行划分,每一内存对象的值划分为若干子值。
步骤S410、依次将各内存对象作为目标内存对象,针对目标内存对象,依次判断其对应的各子值是否与所述内存快照信息中其余任意一内存对象的地址相同;
具体地,本申请在获取内存快照信息之后,可以预先对内存快照信息中各内存对象的地址进行整理,得到该内存快照信息中所有内存对象地址列表。基于此,针对目标内存对象,依次判断目标内存对象的各子值是否与内存对象地址列表中某一地址相同。
可选的,为了方便查找,本申请可以设定内存对象查找顺序。在设定顺序时可以按照内存对象的类型进行设定。如Root类型的内存对象在应用运行过程中,一旦产生则永远不会销毁,直至应用结束。而Object类型的内存对象可以在应用运行过程中产生和销毁。因此,本申请可以将Root类型的内存对象排在Object类型内存对象的前边。
步骤S420、将地址与所述目标内存对象的子值相同的内存对象,确定为所述目标内存对象的引用对象。
具体地,若针对某一目标内存对象的子值,在内存对象地址列表中查找到与该子值相同的地址,则确定目标内存对象引用该地址对应的内存对象。
为了便于理解,本申请通过下述实例进行说明。
参见图12,图12为本申请实施例示例的一个内存对象地址匹配示意图。
假设目标内存对象为ObjectA,其大小为16个字节。则按照4个字节为单位,将ObjectA的值划分为4个子值。进一步,针对ObjectA所在内存快照信息中,各内存对象地址组成的全部对象地址列表如图12所示。
针对4个子值,顺序在全部对象地址列表中查找是否存在相同地址。若查找过程中某个子值确定在全部对象地址列表中查找到相同地址,则结束查找,确定ObjectA引用该地址对应的内存对象。若4个子值全部查找完毕后,未发现相同的地址,则代表ObjectA未引用内存快照信息中其它内存对象。
参见图13,图13介绍了步骤S120的又一实施过程。
如图13所示,该过程可以包括:
步骤S500、以地址所占内存大小为单位,对所述内存快照信息中每一内存对象的值进行划分,每一内存对象的值划分为若干子值;
步骤S510、依次将各内存对象作为目标内存对象,针对目标内存对象,依次判断其对应的各子值是否与所述内存快照信息中其余任意一内存对象的地址相同;
步骤S520、将地址与所述目标内存对象的子值相同的内存对象,确定为所述目标内存对象的引用对象;
步骤S530、根据所述内存快照信息中各内存对象的引用对象,建立内存对象引用关系图,所述内存对象引用关系图中包含所述内存快照信息中各内存对象间的引用关系。
相比于上一实施例的方法,本实施例中进一步增加了针对内存快照信息,建立内存对象引用关系图的过程,通过建立内存对象引用关系图,可以发现内存对象间的多层引用关系,更加便于开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
参见图14,图14示例一种内存对象间多层引用关系示意图。
从图14可以看出,object D这个对象没有被释放,是因为它被object A和objectB引用了,object A没有被释放是因为它又被Root 1和Root2引用了。同理,object B没有被释放,是因为它被Root3引用了。以此类推,当一个对象没有被释放时,有可能被多个对象引用,只有当没有任何内存对象引用它时,它才会被垃圾回收机制释放掉。
下面对本申请实施例提供的内存对象引用关系确定装置进行描述,下文描述的内存对象引用关系确定装置与上文描述的内存对象引用关系确定方法可相互对应参照。
参见图15,图15为本申请实施例公开的一种内存对象引用关系确定装置结构示意图。
如图15所示,该装置包括:
应用启动单元100,用于启动终端装载的目标应用;
内存快照获取单元110,用于获取所述目标应用在运行过程中,目标时间点的内存快照信息,其中所述内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息信息,所述属性信息包括内存对象的地址;
引用关系确定单元120,用于将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
本申请的内存检测装置能够在目标应用运行过程,获取目标时间点的内存快照信息,内存快照信息包含了内存对象的值和地址,进而基于A内存对象引用B内存对象时,A内存对象的值包含B内存对象的地址的原则,将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。通过确定各内存对象间的引用关系,可以帮助开发人员发现多余内存对象未被销毁的本质原因,在代码层取消多余的引用关系,优化代码。
可选的,所述内存快照获取单元可以包括:
函数监控单元,用于Hook所述目标应用提供的内存对象生成函数以及内存对象销毁函数;
属性信息获取单元,用于在监控到所述内存对象生成函数生成内存对象时,获取生成的内存对象的值和属性信息,并存入目标文件;
属性信息删除单元,用于在监控到所述内存对象销毁函数销毁已生成的内存对象时,将所述目标文件中已销毁的内存对象的属性数据删除;
文件复制单元,用于在收到内存快照获取指令时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件,复制文件保存为当前时间点对应的内存快照信息。
可选的,所述目标应用为基于mono平台开发的应用,所述属性信息获取单元可以包括:
libmono.so接口调用单元,用于在监控到C#内存对象生成时,调用libmono.so接口获取所述C#内存对象的属性信息。
可选的,所述libmono.so接口调用单元可以包括:
内存对象大小获取单元,用于在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_object_get_size函数获取所述C#内存对象的大小;
内存对象类型获取单元,用于在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_object_get_class函数获取所述C#内存对象的类型;
内存对象堆栈获取单元,用于在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_stack_walk_no_il函数获取所述C#内存对象的堆栈。
可选的,所述文件复制单元可以包括:
控件检测单元,用于在检测到用户触发终端屏幕上显示的第一控件时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件;
和/或,
场景检测单元,用于在检测到所述目标应用运行至指定场景时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件。
可选的,本申请的内存检测装置还可以包括:
内存占用值确定单元,用于在所述目标应用运行过程中,每隔设定检测周期统计已生成且未被销毁的所有内存对象大小和值,保存为各检测周期的内存占用值;
曲线图绘制单元,用于利用各检测周期的内存占用值,绘制内存占用随时间变化的曲线图;
时间点标记单元,用于在所述曲线图中标记各所述目标时间点的内存占用值,以便用户根据各目标时间点在所述曲线图中的内存占用值,确定所要匹配对象引用关系的内存快照信息。
可选的,所述引用关系确定单元可以包括:
值划分单元,用于以地址所占内存大小为单位,对所述内存快照信息中每一内存对象的值进行划分,每一内存对象的值划分为若干子值;
值判断单元,用于依次将各内存对象作为目标内存对象,针对目标内存对象,依次判断其对应的各子值是否与所述内存快照信息中其余任意一内存对象的地址相同;
引用对象确定单元,用于将地址与所述目标内存对象的子值相同的内存对象,确定为所述目标内存对象的引用对象。
可选的,本申请的装置还可以包括:
引用关系图绘制单元,用于根据确定的所述内存快照信息中各内存对象的引用对象,建立内存对象引用关系图,所述内存对象引用关系图中包含所述内存快照信息中各内存对象间的引用关系。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (16)
1.一种内存对象引用关系确定方法,其特征在于,包括:
启动终端装载的目标应用;
获取所述目标应用在运行过程中,目标时间点的内存快照信息,其中所述内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息,所述属性信息包括内存对象的地址;
将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
2.根据权利要求1所述的方法,其特征在于,所述获取所述目标应用在运行过程中,目标时间点的内存快照信息,包括:
Hook所述目标应用提供的内存对象生成函数以及内存对象销毁函数;
在监控到所述内存对象生成函数生成内存对象时,获取生成的内存对象的值和属性信息,并存入目标文件;
在监控到所述内存对象销毁函数销毁已生成的内存对象时,将所述目标文件中已销毁的内存对象的属性数据删除;
在收到内存快照获取指令时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件,复制文件保存为当前时间点对应的内存快照信息。
3.根据权利要求2所述的方法,其特征在于,所述目标应用为基于mono平台开发的应用,所述在监控到所述内存对象生成函数生成内存对象时,获取生成的内存对象的属性信息,包括:
在监控到C#内存对象生成时,调用libmono.so接口获取所述C#内存对象的属性信息。
4.根据权利要求3所述的方法,其特征在于,所述在监控到C#内存对象生成时,调用libmono.so接口获取所述C#内存对象的属性信息,包括:
在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_object_get_size函数获取所述C#内存对象的大小;
和/或,
在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_object_get_class函数获取所述C#内存对象的类型;
和/或,
在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_stack_walk_no_il函数获取所述C#内存对象的堆栈。
5.根据权利要求2所述的方法,其特征在于,所述在收到内存快照获取指令时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件,包括:
在检测到用户触发终端屏幕上显示的第一控件时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件;
和/或,
在检测到所述目标应用运行至指定场景时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件。
6.根据权利要求1所述的方法,其特征在于,还包括:
在所述目标应用运行过程中,每隔设定检测周期统计已生成且未被销毁的所有内存对象大小和值,保存为各检测周期的内存占用值;
利用各检测周期的内存占用值,绘制内存占用随时间变化的曲线图;
在所述曲线图中标记各所述目标时间点的内存占用值,以便用户根据各目标时间点在所述曲线图中的内存占用值,确定所要匹配对象引用关系的内存快照信息。
7.根据权利要求1-6任一项所述的方法,其特征在于,所述将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系,包括:
以地址所占内存大小为单位,对所述内存快照信息中每一内存对象的值进行划分,每一内存对象的值划分为若干子值;
依次将各内存对象作为目标内存对象,针对目标内存对象,依次判断其对应的各子值是否与所述内存快照信息中其余任意一内存对象的地址相同;
将地址与所述目标内存对象的子值相同的内存对象,确定为所述目标内存对象的引用对象。
8.根据权利要求7所述的方法,其特征在于,在确定所述内存快照信息中各内存对象的引用对象之后,该方法还包括:
根据所述内存快照信息中各内存对象的引用对象,建立内存对象引用关系图,所述内存对象引用关系图中包含所述内存快照信息中各内存对象间的引用关系。
9.一种内存对象引用关系确定装置,其特征在于,包括:
应用启动单元,用于启动终端装载的目标应用;
内存快照获取单元,用于获取所述目标应用在运行过程中,目标时间点的内存快照信息,其中所述内存快照信息包括,自所述目标应用启动时刻至所述目标时间点之间,所有已生成且未被销毁的内存对象的值和属性信息信息,所述属性信息包括内存对象的地址;
引用关系确定单元,用于将所述内存快照信息中每一内存对象的值,与内存快照信息中其余内存对象的地址进行匹配,根据匹配结果确定各内存对象间的引用关系。
10.根据权利要求9所述的装置,其特征在于,所述内存快照获取单元包括:
函数监控单元,用于Hook所述目标应用提供的内存对象生成函数以及内存对象销毁函数;
属性信息获取单元,用于在监控到所述内存对象生成函数生成内存对象时,获取生成的内存对象的值和属性信息,并存入目标文件;
属性信息删除单元,用于在监控到所述内存对象销毁函数销毁已生成的内存对象时,将所述目标文件中已销毁的内存对象的属性数据删除;
文件复制单元,用于在收到内存快照获取指令时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件,复制文件保存为当前时间点对应的内存快照信息。
11.根据权利要求10所述的装置,其特征在于,所述目标应用为基于mono平台开发的应用,所述属性信息获取单元包括:
libmono.so接口调用单元,用于在监控到C#内存对象生成时,调用libmono.so接口获取所述C#内存对象的属性信息。
12.根据权利要求11所述的装置,其特征在于,所述libmono.so接口调用单元包括:
内存对象大小获取单元,用于在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_object_get_size函数获取所述C#内存对象的大小;
内存对象类型获取单元,用于在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_object_get_class函数获取所述C#内存对象的类型;
内存对象堆栈获取单元,用于在监控到C#内存对象生成时,通过libmono.so接口所提供的mono_stack_walk_no_il函数获取所述C#内存对象的堆栈。
13.根据权利要求10所述的装置,其特征在于,所述文件复制单元包括:
控件检测单元,用于在检测到用户触发终端屏幕上显示的第一控件时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件;
和/或,
场景检测单元,用于在检测到所述目标应用运行至指定场景时,将当前时间点作为目标时间点,复制当前时间点的目标文件得到复制文件。
14.根据权利要求9所述的装置,其特征在于,还包括:
内存占用值确定单元,用于在所述目标应用运行过程中,每隔设定检测周期统计已生成且未被销毁的所有内存对象大小和值,保存为各检测周期的内存占用值;
曲线图绘制单元,用于利用各检测周期的内存占用值,绘制内存占用随时间变化的曲线图;
时间点标记单元,用于在所述曲线图中标记各所述目标时间点的内存占用值,以便用户根据各目标时间点在所述曲线图中的内存占用值,确定所要匹配对象引用关系的内存快照信息。
15.根据权利要求9-14任一项所述的装置,其特征在于,所述引用关系确定单元包括:
值划分单元,用于以地址所占内存大小为单位,对所述内存快照信息中每一内存对象的值进行划分,每一内存对象的值划分为若干子值;
值判断单元,用于依次将各内存对象作为目标内存对象,针对目标内存对象,依次判断其对应的各子值是否与所述内存快照信息中其余任意一内存对象的地址相同;
引用对象确定单元,用于将地址与所述目标内存对象的子值相同的内存对象,确定为所述目标内存对象的引用对象。
16.根据权利要求15所述的装置,其特征在于,还包括:
引用关系图绘制单元,用于根据确定的所述内存快照信息中各内存对象的引用对象,建立内存对象引用关系图,所述内存对象引用关系图中包含所述内存快照信息中各内存对象间的引用关系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610969849.9A CN107992429B (zh) | 2016-10-27 | 2016-10-27 | 一种内存对象引用关系确定方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610969849.9A CN107992429B (zh) | 2016-10-27 | 2016-10-27 | 一种内存对象引用关系确定方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107992429A true CN107992429A (zh) | 2018-05-04 |
CN107992429B CN107992429B (zh) | 2021-10-15 |
Family
ID=62029440
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610969849.9A Active CN107992429B (zh) | 2016-10-27 | 2016-10-27 | 一种内存对象引用关系确定方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107992429B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108845934A (zh) * | 2018-05-24 | 2018-11-20 | 深圳市腾讯网络信息技术有限公司 | 内存泄漏源的定位方法和装置、存储介质、电子装置 |
CN109408383A (zh) * | 2018-10-12 | 2019-03-01 | 北京宝兰德软件股份有限公司 | 一种Java内存泄漏分析方法及装置 |
CN110471819A (zh) * | 2019-07-24 | 2019-11-19 | 珠海金山网络游戏科技有限公司 | 一种基于mono内存的模块化分析方法及其装置 |
CN110569108A (zh) * | 2019-09-04 | 2019-12-13 | 腾讯科技(深圳)有限公司 | 小游戏虚拟机执行环境的创建方法及相关产品 |
CN110851279A (zh) * | 2019-11-12 | 2020-02-28 | 腾讯科技(深圳)有限公司 | 一种内存泄露的处理方法、装置、设备及存储介质 |
CN112084028A (zh) * | 2020-09-07 | 2020-12-15 | 北京字节跳动网络技术有限公司 | 一种内存检测方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040216127A1 (en) * | 2002-09-10 | 2004-10-28 | Chutney Technologies | Method and apparatus for accelerating web services |
CN1570910A (zh) * | 2003-07-11 | 2005-01-26 | 北京直真节点技术开发有限公司 | 一种通用对象建模方法及通用对象管理系统 |
CN101046755A (zh) * | 2006-03-28 | 2007-10-03 | 郭明南 | 一种计算机自动内存管理的系统及方法 |
CN101697134A (zh) * | 2009-10-27 | 2010-04-21 | 北京大学 | 一种支持相似虚拟机快速启动的方法 |
CN105630662A (zh) * | 2014-10-28 | 2016-06-01 | 腾讯科技(深圳)有限公司 | 内存检测方法和装置 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
-
2016
- 2016-10-27 CN CN201610969849.9A patent/CN107992429B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040216127A1 (en) * | 2002-09-10 | 2004-10-28 | Chutney Technologies | Method and apparatus for accelerating web services |
CN1570910A (zh) * | 2003-07-11 | 2005-01-26 | 北京直真节点技术开发有限公司 | 一种通用对象建模方法及通用对象管理系统 |
CN101046755A (zh) * | 2006-03-28 | 2007-10-03 | 郭明南 | 一种计算机自动内存管理的系统及方法 |
CN101697134A (zh) * | 2009-10-27 | 2010-04-21 | 北京大学 | 一种支持相似虚拟机快速启动的方法 |
CN105630662A (zh) * | 2014-10-28 | 2016-06-01 | 腾讯科技(深圳)有限公司 | 内存检测方法和装置 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
Non-Patent Citations (2)
Title |
---|
A. AMIRAT: "Towards an Approach for Building Reliable Architectures", 《2007 IEEE INTERNATIONAL CONFERENCE ON INFORMATION REUSE AND INTEGRATION》 * |
林春晓: "基于携带证明的代码的垃圾收集过程验证", 《中国博士学位论文全文数据库 信息科技辑》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108845934A (zh) * | 2018-05-24 | 2018-11-20 | 深圳市腾讯网络信息技术有限公司 | 内存泄漏源的定位方法和装置、存储介质、电子装置 |
CN109408383A (zh) * | 2018-10-12 | 2019-03-01 | 北京宝兰德软件股份有限公司 | 一种Java内存泄漏分析方法及装置 |
CN109408383B (zh) * | 2018-10-12 | 2023-04-14 | 北京宝兰德软件股份有限公司 | 一种Java内存泄漏分析方法及装置 |
CN110471819A (zh) * | 2019-07-24 | 2019-11-19 | 珠海金山网络游戏科技有限公司 | 一种基于mono内存的模块化分析方法及其装置 |
CN110471819B (zh) * | 2019-07-24 | 2023-05-16 | 珠海金山数字网络科技有限公司 | 一种基于mono内存的模块化分析方法及其装置 |
CN110569108A (zh) * | 2019-09-04 | 2019-12-13 | 腾讯科技(深圳)有限公司 | 小游戏虚拟机执行环境的创建方法及相关产品 |
CN110851279A (zh) * | 2019-11-12 | 2020-02-28 | 腾讯科技(深圳)有限公司 | 一种内存泄露的处理方法、装置、设备及存储介质 |
CN110851279B (zh) * | 2019-11-12 | 2023-10-13 | 腾讯科技(深圳)有限公司 | 一种内存泄露的处理方法、装置、设备及存储介质 |
CN112084028A (zh) * | 2020-09-07 | 2020-12-15 | 北京字节跳动网络技术有限公司 | 一种内存检测方法及装置 |
CN112084028B (zh) * | 2020-09-07 | 2022-02-25 | 北京字节跳动网络技术有限公司 | 一种内存检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107992429B (zh) | 2021-10-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107992429A (zh) | 一种内存对象引用关系确定方法及装置 | |
CN106484580B (zh) | 一种内存检测方法、装置及系统 | |
CN111581433B (zh) | 视频处理方法、装置、电子设备及计算机可读介质 | |
CN110941736B (zh) | 一种电子照片显示方法、装置和移动设备 | |
CN107622008A (zh) | 一种应用页面的遍历方法和装置 | |
WO2018152822A1 (zh) | 一种生成相册的方法、装置和移动终端 | |
CN107193571A (zh) | 界面推送的方法、移动终端及存储介质 | |
CN114049631A (zh) | 一种数据标注的方法、装置、计算机设备和存储介质 | |
CN106371706A (zh) | 应用快捷方式位置选择的方法及装置 | |
CN111263241B (zh) | 媒体数据的生成方法、装置、设备及存储介质 | |
CN103365535B (zh) | 信息处理装置及信息处理方法 | |
US7237197B2 (en) | Method and system for presenting a video stream of a video streaming device | |
CN112817782B (zh) | 一种数据采集上报方法、装置、电子设备和存储介质 | |
CN111338946B (zh) | 安卓模拟器检测方法及装置 | |
CN107402886A (zh) | 堆栈分析方法及相关装置 | |
WO2020103074A1 (zh) | 图像搜索方法、装置、存储介质及电子设备 | |
CN111352917A (zh) | 信息录入方法、装置、电子设备及存储介质 | |
CN107589978B (zh) | 一种Flash中页面刷新方法及装置 | |
CN110619541A (zh) | 应用程序管理方法、装置、计算机设备及存储介质 | |
CN117290302B (zh) | 目录分离方法、装置、计算机设备和存储介质 | |
CN108491550A (zh) | 一种综述的生成方法、装置以及设备 | |
JP2004304585A (ja) | 画像管理装置、画像管理方法及び画像管理用プログラム | |
CN117170943A (zh) | 设备测试方法、装置、电子设备和计算机可读存储介质 | |
CN116775955A (zh) | 数据标签固化方法、装置、计算机设备和存储介质 | |
CN116737216A (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 |