一种对移动应用的内存对象进行分析的方法和装置与流程

文档序号:12464246阅读:187来源:国知局
一种对移动应用的内存对象进行分析的方法和装置与流程

本发明涉及计算机技术领域,尤其涉及一种对移动应用的内存对象进行分析的技术。



背景技术:

移动端设备内存空间比较有限,要求开发人员在进行移动app(应用)开发时高效规范的使用内存。特别是在Android(安卓系统)开发中,许多低端机型的内存容量较小,不规范的内存使用非常容易产生Out Of Memory(内存不足,OOM)问题,极大地损害了用户体验。

现有对内存对象的分析主要通过集成开发环境自带的内存分析工具来完成,这些工具主要通过主动Dump(抓取)内存快照,并对Dump得到的内存快照文件进行解析,获取不同类型内存对象的信息来获取当前app内存的使用情况。所述内存分析工具中只能对底层具体对象的内存使用进行分析,无法从更高层次掌握app业务逻辑对内存的使用。例如:图片在内存中使用byte数组进行表示,通过目前的分析工具能够获悉byte数组的大小,但是却无法观察该图片的样子,属于哪个业务。

当前的内存分析工具分析内存的方式过于抽象,使得开发人员无法直观地对当前内存对象使用进行了解,降低了调试的效率。因此在出现内存泄漏,尤其是图片泄漏时,需要开发人员人工对内存中的对象进行查找,效率低下。

因此,如何提供能够帮助用户快速定位内存泄漏的源头,并能使用户直观地获悉创建所述对象对应的操作的一种对移动应用的内存对象进行分析的技术,成为本领域技术人员亟需解决的技术问题之一。



技术实现要素:

本发明的目的是提供一种对移动应用的内存对象进行分析的方法和装置。

根据本发明的一个方面,提供一种对移动应用的内存对象进行分析的方法,其中,该方法包括以下步骤:

a获取用户自对象容器中所确定的发生内存泄漏的对象,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应;

b根据所述发生内存泄漏的对象所对应的标记,查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。

优选地,所述步骤b包括:

通过遍历所有对象,查找所确定的发生内存泄漏的对象;

根据所述发生内存泄漏的对象所对应的标记,反向构建出持有关系的最短路径,从而查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。

优选地,该方法还包括:

x系统调用对象创建方法时,通过劫持方式接管所述对象创建方法,以创建所述对象;

y创建所述对象时,对创建过程中生成的所述对象进行标记;

z将标记后的所述对象及其对应的属性在所述对象容器中展现给所述用户。

优选地,所述步骤y包括:

创建所述对象时,使用带键值的弱引用对创建过程中生成的所述对象进行标记。

优选地,该方法还包括:

根据被回收的对象,对所述对象容器进行更新,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应。

优选地,所述劫持方式包括:

通过反射找到与所述对象对应的类和所述类中创建所述对象的方法和参数;

修改所述方法的类型,反向调用JAVA层的方法。

优选地,所述步骤z包括:

按照预定规则,对所述标记后的所述对象及其对应的属性进行排序;

在所述对象容器中,将经过排序的所述标记后的所述对象及其对应的属性展现给搜索用户;

其中,所述预定规则包括以下至少任一项:

按照所述对象的生成时间对所述对象及其对象的属性进行排序;

按照所述对象的大小对所述对象及其对象的属性进行排序。

根据本发明的另一个方面,还提供了一种用于对移动应用的内存对象进行分析的分析装置,其中,该分析装置包括:

获取装置,用于获取用户自对象容器中所确定的发生内存泄漏的对象,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应;

查找装置,用于根据所述发生内存泄漏的对象所对应的标记,查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。

优选地,所述查找装置用于:

通过遍历所有对象,查找所确定的发生内存泄漏的对象;

根据所述发生内存泄漏的对象所对应的标记,反向构建出持有关系的最短路径,从而查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。

优选地,该分析装置还包括:

劫持装置,用于系统调用对象创建方法时,通过劫持方式接管所述对象创建方法,以创建所述对象;

标记装置,用于创建所述对象时,对创建过程中生成的所述对象进行标记;

展现装置,用于将标记后的所述对象及其对应的属性在所述对象容器中展现给所述用户。

优选地,所述标记装置用于:

创建所述对象时,使用带键值的弱引用对创建过程中生成的所述对象进行标记。

优选地,该分析装置还包括:

更新装置,用于根据被回收的对象,对所述对象容器进行更新,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应。

优选地,所述劫持方式包括:

通过反射找到与所述对象对应的类和所述类中创建所述对象的方法和参数;

修改所述方法的类型,反向调用JAVA层的方法。

优选地,所述展现装置包括:

排序单元,用于按照预定规则,对所述标记后的所述对象及其对应的属性进行排序;

展现单元,用于在所述对象容器中,将经过排序的所述标记后的所述对象及其对应的属性展现给搜索用户;

其中,所述预定规则包括以下至少任一项:

按照所述对象的生成时间对所述对象及其对象的属性进行排序;

按照所述对象的大小对所述对象及其对象的属性进行排序。

与现有技术相比,本发明具有以下优点:

本发明根据用户自对象容器中确定的发生内存泄漏的对象和与发生内存泄漏的对象对应的标记,查找到内存泄漏的引用路径,帮助用户快速定位内存泄漏的源头,优化内存的使用,提升用户的使用体验。

进一步地,本发明对所有对象进行标记,将标记后的所述对象及其对应的属性在所述对象容器中展现给所述用户,使得用户能够实时直观的观察内存使用情况,获悉其大小、创建时间等信息,从而更加直观的获悉创建所述对象对应的操作,提高了调试的效率。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1示出根据本发明一个方面的一种对移动应用的内存对象进行分析的分析装置的结构示意图;

图2示出根据本发明一个实施例的对标记后的图片以及图片属性展示的示意图;

图3示出根据本发明另一个方面的一种对移动应用的内存对象进行分析的方法的流程示意图。

附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。

后面所讨论的方法(其中一些通过流程图示出)可以通过硬件、软件、固件、中间件、微代码、硬件描述语言或者其任意组合来实施。当用软件、固件、中间件或微代码来实施时,用以实施必要任务的程序代码或代码段可以被存储在机器或计算机可读介质(比如存储介质)中。(一个或多个)处理器可以实施必要的任务。

这里所公开的具体结构和功能细节仅仅是代表性的,并且是用于描述本发明的示例性实施例的目的。但是本发明可以通过许多替换形式来具体实现,并且不应当被解释成仅仅受限于这里所阐述的实施例。

应当理解的是,虽然在这里可能使用了术语“第一”、“第二”等等来描述各个单元,但是这些单元不应当受这些术语限制。使用这些术语仅仅是为了将一个单元与另一个单元进行区分。举例来说,在不背离示例性实施例的范围的情况下,第一单元可以被称为第二单元,并且类似地第二单元可以被称为第一单元。这里所使用的术语“和/或”包括其中一个或更多所列出的相关联项目的任意和所有组合。

应当理解的是,当一个单元被称为“连接”或“耦合”到另一单元时,其可以直接连接或耦合到所述另一单元,或者可以存在中间单元。与此相对,当一个单元被称为“直接连接”或“直接耦合”到另一单元时,则不存在中间单元。应当按照类似的方式来解释被用于描述单元之间的关系的其他词语(例如“处于...之间”相比于“直接处于...之间”,“与...邻近”相比于“与...直接邻近”等等)。

这里所使用的术语仅仅是为了描述具体实施例而不意图限制示例性实施例。除非上下文明确地另有所指,否则这里所使用的单数形式“一个”、“一项”还意图包括复数。还应当理解的是,这里所使用的术语“包括”和/或“包含”规定所陈述的特征、整数、步骤、操作、单元和/或组件的存在,而不排除存在或添加一个或更多其他特征、整数、步骤、操作、单元、组件和/或其组合。

还应当提到的是,在一些替换实现方式中,所提到的功能/动作可以按照不同于附图中标示的顺序发生。举例来说,取决于所涉及的功能/动作,相继示出的两幅图实际上可以基本上同时执行或者有时可以按照相反的顺序来执行。

图1示出根据本发明一个方面的一种对移动应用的内存对象进行分析的分析装置的结构示意图。分析装置1包括:获取装置101和查找装置102。

在此,分析装置1例如位于用户设备中,所述用户设备包括但不限于个人电脑、便携式电脑、平板电脑、智能手机、PDA等,分析装置1通过网络、数据连接线或者其他方式与移动设备联接,以对移动应用的内存对象进行分析。移动设备包括但不限于平板电脑、智能手机、PDA等。本领域技术人员应能理解上述用户设备和移动设备仅为举例,现有的或者今后可能出现的用户设备或移动设备如可适用于本发明也应包含在本发明保护范围内,并以引用的方式包含于此。本领域技术人员还应能理解,此处所述用户设备、移动设备,指可以通过运行预定程序或指令来执行数值计算和/或逻辑计算等预定处理过程的智能电子设备,其可以包括处理器与存储器,由处理器执行在存储器中预存的存续指令来执行预定处理过程,或是由ASIC、FPGA、DSP等硬件执行预定处理过程,或是由上述二者组合来实现。

获取装置101获取用户自对象容器中所确定的发生内存泄漏的对象,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应。具体地,某些移动应用使用过的对象,由于非主观的因素驻留在内存的某一内存块中,导致所述内存块无法得到释放,即所述内存发生内存泄漏。移动应用程序运行时,内存中对应的对象被存储于对象容器中,如果在此期间内存中某个对象被回收,则分析装置1将所述对象从容器中移除,以保证该对象容器中所有的对象均为内存中未释放的对象,即所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应,用户通过人工识别或者通过自动识别的方式确定所述对象容器中发生内存泄漏的对象,获取装置101通过一次或多次调用该用户设备所提供的应用程序接口(API)或其他约定的通信方式,获取用户自对象容器中所确定的发生内存泄漏的对象。

例如,所述对象为图片,在移动设备的安卓系统中,图片使用Bitmap标识,即App中所有的图片都是使用Bitmap类或者相关的工具类创建出来的,且创建的过程在安卓操作系统的Framework层完成,图片被放入对象容器中后,如果图片被回收,即调用了Bitmap的finalize方法,分析装置1将该图片从所述对象容器中移除,所述对象容器中所存储的图片与移动应用在内存中的未释放图片实时对应,用户根据开发经验、当前运行的程序或者当前活动窗口判断哪些图片发生了内存泄漏,或者通过自动识别工具识别哪些图片发生了内存泄漏,以便分析装置1对发生内存泄漏的图片进行分析和定位,例如,某个图片只能出现在百度地图中,用户发现此时百度地图已经被关闭,而且近期内该百度地图不会再被调用,则判断该图片发生了内存泄漏;如果用户要把该图片留在内存中,以便下次访问百度地图时访问速度加快,则判断该图片为缓存图片,不属于内存泄漏。

本领域技术人员应能理解,用户自对象容器中确定发生内存泄漏的对象的方式仅为举例,现有的或者今后可能出现的用户确定发生内存泄漏的对象的方式如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

查找装置102根据所述发生内存泄漏的对象所对应的标记,查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。具体地,用户若想快速分析并定位内存泄漏的源头,可以使用预定的方式对内存中的所有对象进行标记。例如,通过hook方式劫持所述对象,完成对所述对象的标记,其中,所述标记为用另一个类封装所述对象并编号,并不会对所述对象的内容进行改变,然后将标记后的对象按照编号顺序放入所述对象容器中统一管理,其中,所述对象容器中所存储的所述对象与移动应用在内存中未释放的对象实时对应,用户通过人工识别或者通过自动识别的方式确定所述对象容器中发生内存泄漏的对象,获取装置101获取用户自对象容器中所确定的发生内存泄漏的带标记的对象。在移动设备中,应用程序的内存占用情况被存储为系统内存检查文件,在对该文件进行分析时,查找装置102根据获取装置101获取的对象的标记,通过预定的搜索方法,例如,深度优先搜索或者广度优先搜索,搜索系统中所述对象被调用的引用路径,根据所述引用路径确定调用过所述对象,并且在调用完成后没有回收所述对象的程序或者程序段,查找装置102据此确定造成所述对象发生内存泄漏的源头。

例如,所述对象为图片,移动设备采用的系统为安卓系统时,系统中每个应用程序的内存占用情况可以使用内存快照进行描述,内存快照一般存储为hprof格式的文件,其中,所述hprof格式的文件为一种系统内存检查文件,所述hprof格式的文件描述了当前应用程序中所有的基本类型,对象、栈和堆的使用状态,通过对该文件的分析,能够找到某个类的对象在内存中的引用路径,具体地,分析装置1对所有的Bitmap都进行了标记,在读取分析hprof文件时,根据获取装置101获取到的发生内存泄漏的图片的标记,查找装置102搜索查找所述对象容器中的图片,并存储所述图片的引用路径,查找到所述发生内存泄漏的图片,得到所述发生内存泄漏的图片的引用路径,确定图片泄露的源头。

本领域技术人员应能理解,上述查找到所述发生内存泄漏的对象的引用路径的方法仅为举例,现有的或者今后可能出现的查找引用路径的方法如可适用于本发明,都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

优选地,所述查找装置102通过遍历所有对象,查找所确定的发生内存泄漏的对象;根据所述发生内存泄漏的对象所对应的标记,反向构建出持有关系的最短路径,从而查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。具体地,所述查找装置102通过预定的遍历方法遍历所有对象,在遍历的过程中根据所述标记,查找所确定的发生内存泄漏的对象,并在遍历的过程中存储所述对象的引用关系;根据所述发生内存泄漏的对象所对应的标记,以及在遍历过程中存储的所述对象的引用关系,反向构建出持有关系的最短路径,即可得到所述对象的引用路径,找到所述对象泄露的源头。其中,所述遍历是指沿着某条搜索路线,依次对每个结点均做一次且仅做一次访问;其中,所述遍历包括但不限于:图的遍历,所述图的遍历包括但不限于:深度优先遍历、广度优先遍历等;其中,所述引用关系指遍历中引用所述对象的某个节点存储的父节点或者子节点。

例如,所述对象为图片类型,查找装置102通过广度优先遍历方法,遍历所有的图片,以找到所有发生泄漏的图片,并在遍历的过程中存储所述发生泄漏的图片的引用关系,例如存储发生泄漏的每一个图片被引用的节点的父节点或者子节点的信息,查找装置102通过找到的发生泄漏的图片,并且基于存储的所述引用关系,反向构建构持有关系的最短路径,即可得到所述图片的引用路径,根据所述引用路径,找到图片泄漏的应用程序。

在此,分析装置1根据用户自对象容器中确定的发生内存泄漏的对象和与发生内存泄漏的对象对应的标记,查找到内存泄漏的引用路径,帮助用户快速定位内存泄漏的源头,排除无效缓存,优化内存的使用,提升用户的使用体验。

优选地,分析装置1还包括:劫持装置103(未示出)、标记装置104(未示出)和展现装置105(未示出)。

其中,系统调用对象创建方法时,劫持装置103通过劫持方式接管所述对象创建方法,以创建所述对象。具体地,要想对移动应用中的对象进行标记,必须在对象的创建过程中就获取到图片,可以通过劫持装置103的劫持方式,例如hook机制,在系统调用所述对象相应的创建方法时,对系统方法进行劫持,接管所述对象的创建周期,修改创建所述对象的方法的类型,以创建所述对象。优选地,所述劫持方式包括:1)通过反射找到与所述对象对应的类和所述类中创建所述对象的方法和参数;2)修改所述方法的类型,反向调用JAVA层的方法。具体地,在JAVA层通过反射找到与对象创建方法对应的类和方法和参数等信息,在系统native层修改该对象创建方法类型,在系统native层处理该对象创建过程,在系统native层反向调用Java层的方法通知对象创建的事件,在JAVA层完成对象的标记。例如,当所述对象为图片时,在JAVA层通过反射找到与图片创建方法对应的Bitmap类、Bitmap类中创建图片的createBitmap方法和参数等信息,在系统native层修改图片创建方法类型,将其修改为native类型的方法,当系统执行到该方法时去寻找该方法的native实现,再通过JNI反向调用JAVA层的方法,在JAVA层完成所述图片的标记。

本领域技术人员应能理解,上述劫持方式仅为举例,现有的或者今后可能出现的劫持方式,如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

创建所述对象时,标记装置104对创建过程中生成的所述对象进行标记。具体地,在所述对象的创建过程中,每个对象创建时,先调用方法A,告知标记装置104创建即将开始,然后通过正常的对象创建方法创建所述对象,对象创建完成之后调用方法B告知标记装置104创建完成,可以开始标记。标记装置104通过所述方法B对所述创建完的对象进行标记,在每创建完一个对象的同时便标记一个对象,直到完成对所有对象的标记,优选地,标记装置104将标记完成后的所述对象按照顺序放入所述对象容器中统一管理。其中,所述方法A为用户设计的,对象创建之前调用的方法,以告知标记装置104准备进行对象创建;所述方法B为用户根据需要设计的,告知标记装置104对象创建已经完成,并对所述对象进行标记的方法。

优选地,创建所述对象时,标记装置104使用带键值的弱引用对创建过程中生成的所述对象进行标记。具体地,当所述对象被其他对象强持有时,能够通过所述带键值的弱引用观察到该对象,如果该对象没有被强持有时,垃圾回收器也能够直接回收掉该对象而不影响内存占用的分析,因此标记装置104使用带键值的弱引用对创建过程中生成的所述对象进行标记,有助于对所述对象的追踪和释放,优选地,对象标记完成后,标记装置104将所述弱引用按照顺序放入对象容器中统一管理。

本领域技术人员应能理解,所述使用带键值的弱引用对创建过程中生成的所述对象进行标记的标记方式仅为举例,现有的或者今后可能出现的标记方式,如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

展现装置105将标记后的所述对象及其对应的属性在所述对象容器中展现给所述用户。具体地,展现装置105获取容器中所有对象的弱引用,直接使用对象的所述带键值(key)的弱引用,在所述对象容器中,展示相应的所述对象,展现装置105可以随机展现所述对象容器中标记后的所述对象及其对应的属性,也可以将所述对象进行排序后,展现给所述用户;展现装置105例如通过一次或多次调用诸如JSP、ASP或PHP等动态页面技术,以约定的显示方式,提供给所述用户,例如,将所述对象以每页展示预定数量的形式,提供给所述用户,用户可以通过下拉屏幕或点击“下一页”图标按钮,从而继续查看多个所述对象,用户还可通过在显示窗口通过点击按钮选择排序的方式,例如选择按照大小排序或者按照生成时间排序。

例如,所述对象类型为图片时,展现装置105根据时间倒叙排列展示所述标记图片的示意图如图2所示,图2中展现装置105向用户展现了所述标记图片,所述标记图片的尺寸、存储大小、对图片的标记等图片的属性,以及展现装置105采用的排序方法、展现图片的数量和总大小,图2中key表示所述图片的标记。

在此,分析装置1将标记后的所述对象及其对应的属性在所述对象容器中展现给所述用户,使得用户能够实时直观地观察内存使用情况,观察所述对象的样子,属于哪个业务,并获悉其大小、创建时间等信息,从而更加直观地获悉创建所述对象对应的操作,提高了调试的效率。进一步地,用户根据展现装置105在所述对象容器中展现的所述对象及其对象的属性,判断该对象是否为内存泄漏,确定发生内存泄漏的对象,获取装置101获取用户根据展现装置105确定的发生内存泄漏的对象及其标记,查找装置102根据所述标记,查找并确定内存泄漏的源头。

一个典型的应用场景如下:该分析装置1用于“手机百度”产品中,在调试模式下,使用该分析装置1对“手机百度”中的图片内存使用进行分析,快速地排查程序中的图片泄漏,无效缓存等一系列内存使用问题,优化“手机百度”的性能。

本领域技术人员应能理解,用户确定发生内存泄漏的对象的方法仅为举例,现有的或者今后可能出现的用户确定发生内存泄漏的对象的方法如可使用与本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

优选地,分析装置1还包括:更新装置106(未示出)。

其中,更新装置106根据被回收的对象,对所述对象容器进行更新,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应。具体地,移动应用程序运行过程中,如果对象被收回,则该对象没有造成内存泄漏,更新装置106将所述对象从所述对象容器中实时移除,更新所述对象容器,以保证所述对象容器中所有对象均为内存中未释放的对象,并且,所述对象容器中所存储的对象与移动应用在内存中未释放的对象实时对应。例如,所述对象为图片,如果图片被回收,即调用了Bitmap的finalize方法,则更新装置按照同样的方法将所述图片从所述对象容器中移除。

在此,被回收的对象被收回时,将所述对象从对象容器中移除,以保证该对象容器中的所有图片均为内存中未释放的图片。

优选地,所述展现装置105包括:排序单元1051(未示出)和展现单元1052(未示出)。

其中,排序单元1051按照预定规则,对所述标记后的所述对象及其对应的属性进行排序;其中,所述预定规则包括以下至少任一项:

按照所述对象的生成时间对所述对象及其对象的属性进行排序;

按照所述对象的大小对所述对象及其对象的属性进行排序。

具体地,为了便于用户直观的观察当前移动应用中驻留内存的对象,排序单元1051按照预定规则,例如按根据对象生成的时间顺序对所述对象以及所述对象的属性按照顺序或者倒序进行排序,或者根据对象的大小对所述对象以及所述对象的属性进行顺序或者倒序排序。其中,所述对象生成的时间顺序对应于所述标记的顺序。

展现单元1052在所述对象容器中,将经过排序的所述标记后的所述对象及其对应的属性展现给搜索用户。具体地,所述展现单元1052通过弹出对话框的方式,将经过排序的标记后的所述对象及其对应的属性展现给所述搜索用户;或者所述展现单元1052通过将所述经过排序的所述标记后的所述对象及其对应的属性存储为文件格式的形式提供给用户,以便用户实时保存所述内存占用过程。进一步地,所述对象展现的过程是实时的,动态变化的过程,所述对象的数量、内容或者属性会随着程序的运行而不断变化。当所述对象为图片时,展现装置105对所述图片的展示如图2所示,图2示对标记后的图片以及图片属性展示的示意图。

图3示出根据本发明另一个方面的一种对移动应用的内存对象进行分析的方法的流程示意图。

在步骤S301中,分析装置1获取用户自对象容器中所确定的发生内存泄漏的对象,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应。具体地,某些移动应用使用过的对象,由于非主观的因素驻留在内存的某一内存块中,导致所述内存块无法得到释放,即所述内存发生内存泄漏。移动应用程序运行时,内存中对应的对象被存储于对象容器中,如果在此期间内存中某个对象被回收,则分析装置1将所述对象从容器中移除,以保证该对象容器中所有的对象均为内存中未释放的对象,即所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应,用户通过人工识别或者通过自动识别的方式确定所述对象容器中发生内存泄漏的对象,在步骤S301中,分析装置1通过一次或多次调用该用户设备所提供的应用程序接口(API)或其他约定的通信方式,获取用户自对象容器中所确定的发生内存泄漏的对象。

例如,所述对象为图片,在移动设备的安卓系统中,图片使用Bitmap标识,即App中所有的图片都是使用Bitmap类或者相关的工具类创建出来的,且创建的过程在安卓操作系统的Framework层完成,图片被放入对象容器中后,如果图片被回收,即调用了Bitmap的finalize方法,分析装置1将该图片从所述对象容器中移除,所述对象容器中所存储的图片与移动应用在内存中的未释放图片实时对应,用户根据开发经验、当前运行的程序或者当前活动窗口判断哪些图片发生了内存泄漏,或者通过自动识别工具识别哪些图片发生了内存泄漏,以便分析装置1对发生内存泄漏的图片进行分析和定位,例如,某个图片只能出现在百度地图中,用户发现此时百度地图已经被关闭,而且近期内该百度地图不会再被调用,则判断该图片发生了内存泄漏;如果用户要把该图片留在内存中,以便下次访问百度地图时访问速度加快,则判断该图片为缓存图片,不属于内存泄漏。

本领域技术人员应能理解,用户自对象容器中确定发生内存泄漏的对象的方式仅为举例,现有的或者今后可能出现的用户确定发生内存泄漏的对象的方式如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

在步骤S302中,分析装置1根据所述发生内存泄漏的对象所对应的标记,查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。具体地,用户若想快速分析并定位内存泄漏的源头,可以使用预定的方式对内存中的所有对象进行标记。例如,通过hook方式劫持所述对象,完成对所述对象的标记,其中,所述标记为用另一个类封装所述对象并编号,并不会对所述对象的内容进行改变,然后将标记后的对象按照编号顺序放入所述对象容器中统一管理,其中,所述对象容器中所存储的所述对象与移动应用在内存中未释放的对象实时对应,用户通过人工识别或者通过自动识别的方式确定所述对象容器中发生内存泄漏的对象,在步骤S301中,分析装置1获取用户自对象容器中所确定的发生内存泄漏的带标记的对象。在移动设备中,应用程序的内存占用情况被存储为系统内存检查文件,在对该文件进行分析时,在步骤S302中,分析装置1根据其在步骤S301中获取的对象的标记,通过预定的搜索方法,例如,深度优先搜索或者广度优先搜索,搜索系统中所述对象被调用的引用路径,根据所述引用路径确定调用过所述对象,并且在调用完成后没有回收所述对象的程序或者程序段,在步骤S301中,分析装置1据此确定造成所述对象发生内存泄漏的源头。

例如,所述对象为图片,移动设备采用的系统为安卓系统时,系统中每个应用程序的内存占用情况可以使用内存快照进行描述,内存快照一般存储为hprof格式的文件,其中,所述hprof格式的文件为一种系统内存检查文件,所述hprof格式的文件描述了当前应用程序中所有的基本类型,对象、栈和堆的使用状态,通过对该文件的分析,能够找到某个类的对象在内存中的引用路径,具体地,分析装置1对所有的Bitmap都进行了标记,在读取分析hprof文件时,根据分析装置1在步骤S301中获取到的发生内存泄漏的图片的标记,在步骤S302中,分析装置1搜索查找所述对象容器中的图片,并存储所述图片的引用路径,查找到所述发生内存泄漏的图片,得到所述发生内存泄漏的图片的引用路径,确定图片泄露的源头。

本领域技术人员应能理解,上述查找到所述发生内存泄漏的对象的引用路径的方法仅为举例,现有的或者今后可能出现的查找引用路径的方法如可适用于本发明,都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

优选地,在步骤S302中,分析装置1通过遍历所有对象,查找所确定的发生内存泄漏的对象;根据所述发生内存泄漏的对象所对应的标记,反向构建出持有关系的最短路径,从而查找到所述发生内存泄漏的对象的引用路径,确定所述内存泄漏的源头。具体地,在步骤S302中,分析装置1通过预定的遍历方法遍历所有对象,在遍历的过程中根据所述标记,查找所确定的发生内存泄漏的对象,并在遍历的过程中存储所述对象的引用关系;根据所述发生内存泄漏的对象所对应的标记,以及在遍历过程中存储的所述对象的引用关系,反向构建出持有关系的最短路径,即可得到所述对象的引用路径,找到所述对象泄露的源头。其中,所述遍历是指沿着某条搜索路线,依次对每个结点均做一次且仅做一次访问;其中,所述遍历包括但不限于:图的遍历,所述图的遍历包括但不限于:深度优先遍历、广度优先遍历等;其中,所述引用关系指遍历中引用所述对象的某个节点存储的父节点或者子节点。

例如,所述对象为图片类型,在步骤S302中,分析装置1通过广度优先遍历方法,遍历所有的图片,以找到所有发生泄漏的图片,并在遍历的过程中存储所述发生泄漏的图片的引用关系,例如存储发生泄漏的每一个图片被引用的节点的父节点或者子节点的信息,在步骤S302中,分析装置1通过找到的发生泄漏的图片,并且基于存储的所述引用关系,反向构建构持有关系的最短路径,即可得到所述图片的引用路径,根据所述引用路径,找到图片泄漏的应用程序。

在此,分析装置1根据用户自对象容器中确定的发生内存泄漏的对象和与发生内存泄漏的对象对应的标记,查找到内存泄漏的引用路径,帮助用户快速定位内存泄漏的源头,排除无效缓存,优化内存的使用,提升用户的使用体验。

优选地,该方法还包括:步骤S303(未示出)、步骤S304(未示出)和步骤S305(未示出)。

其中,系统调用对象创建方法时,在步骤S301中,分析装置1通过劫持方式接管所述对象创建方法,以创建所述对象。具体地,要想对移动应用中的对象进行标记,必须在对象的创建过程中就获取到图片,可以通过步骤S303的劫持方式,例如hook机制,在系统调用所述对象相应的创建方法时,对系统方法进行劫持,接管所述对象的创建周期,修改创建所述对象的方法的类型,以创建所述对象。优选地,所述劫持方式包括:1)通过反射找到与所述对象对应的类和所述类中创建所述对象的方法和参数;2)修改所述方法的类型,反向调用JAVA层的方法。具体地,在JAVA层通过反射找到与对象创建方法对应的类和方法和参数等信息,在系统native层修改该对象创建方法类型,在系统native层处理该对象创建过程,在系统native层反向调用Java层的方法通知对象创建的事件,在JAVA层完成对象的标记。例如,当所述对象为图片时,在JAVA层通过反射找到与图片创建方法对应的Bitmap类、Bitmap类中创建图片的createBitmap方法和参数等信息,在系统native层修改图片创建方法类型,将其修改为native类型的方法,当系统执行到该方法时就会去寻找该方法的native实现,再通过JNI反向调用JAVA层的方法,在JAVA层完成所述图片的标记。

本领域技术人员应能理解,上述劫持方式仅为举例,现有的或者今后可能出现的劫持方式,如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

创建所述对象时,在步骤S304中,分析装置1对创建过程中生成的所述对象进行标记。具体地,在所述对象的创建过程中,每个对象创建时,先调用方法A,告知分析装置1创建即将开始,然后通过正常的对象创建方法创建所述对象,对象创建完成之后调用方法B告知分析装置1创建完成,可以开始标记。在步骤S304中,分析装置1通过所述方法B对所述创建完的对象进行标记,在每创建完一个对象的同时便标记一个对象,直到完成对所有对象的标记,优选地,在步骤S304中,分析装置1将标记完成后的所述对象按照顺序放入所述对象容器中统一管理。其中,所述方法A为用户设计的,对象创建之前调用的方法,以告知分析装置1准备进行对象创建;所述方法B为用户根据需要设计的,告知分析装置1对象创建已经完成,并对所述对象进行标记的方法。

优选地,创建所述对象时,在步骤S304中,分析装置1使用带键值的弱引用对创建过程中生成的所述对象进行标记。具体地,当所述对象被其他对象强持有时,能够通过所述带键值的弱引用观察到该对象,如果该对象没有被强持有时,垃圾回收器也能够直接回收掉该对象而不影响内存占用的分析,因此在步骤S304中,分析装置1使用带键值的弱引用对创建过程中生成的所述对象进行标记,有助于对所述对象的追踪和释放,优选地,对象标记完成后,分析装置1在步骤S304中将所述弱引用按照顺序放入对象容器中统一管理。

本领域技术人员应能理解,所述使用带键值的弱引用对创建过程中生成的所述对象进行标记的标记方式仅为举例,现有的或者今后可能出现的标记方式,如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

在步骤S305中,分析装置1将标记后的所述对象及其对应的属性在所述对象容器中展现给所述用户。具体地,在步骤S305中,分析装置1获取容器中所有对象的弱引用,直接使用对象的所述带键值(key)的弱引用,在所述对象容器中,展示相应的所述对象,在步骤S305中,分析装置1可以随机展现所述对象容器中标记后的所述对象及其对应的属性,也可以将所述对象进行排序后,展现给所述用户;在步骤S305中,分析装置1例如通过一次或多次调用诸如JSP、ASP或PHP等动态页面技术,以约定的显示方式,提供给所述用户,例如,将所述对象以每页展示预定数量的形式,提供给所述用户,用户可以通过下拉屏幕或点击“下一页”图标按钮,从而继续查看多个所述对象,用户还可通过在显示窗口通过点击按钮选择排序的方式,例如选择按照大小排序或者按照生成时间排序。

例如,所述对象类型为图片时,在步骤S305中,分析装置1根据时间倒叙排列展示所述标记图片的示意图如图2所示,图2中展现装置105向用户展现了所述标记图片,所述标记图片的尺寸、存储大小、对图片的标记等图片的属性,以及分析装置1采用的排序方法、展现图片的数量和总大小,图2中key表示所述图片的标记。

在此,分析装置1将标记后的所述对象及其对应的属性在所述对象容器中展现给所述用户,使得用户能够实时直观地观察内存使用情况,观察所述对象的样子,属于哪个业务,并获悉其大小、创建时间等信息,从而更加直观地获悉创建所述对象对应的操作,提高了调试的效率。进一步地,用户根据分析装置1在所述对象容器中展现的所述对象及其对象的属性,判断该对象是否为内存泄漏,确定发生内存泄漏的对象,在步骤S301中,分析装置1获取用户根据分析装置1在步骤S305中确定的发生内存泄漏的对象及其标记,在步骤S302中,分析装置1根据所述标记,查找并确定内存泄漏的源头。

一个典型的应用场景如下:该方法应用于“手机百度”产品中,在调试模式下,使用该方法对“手机百度”中的图片内存使用进行分析,快速地排查程序中的图片泄漏,无效缓存等一系列内存使用问题,优化“手机百度”的性能。

本领域技术人员应能理解,用户确定发生内存泄漏的对象的方法仅为举例,现有的或者今后可能出现的用户确定发生内存泄漏的对象的方法如可使用与本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。

优选地,该方法还包括:步骤S306(未示出)。

其中,在步骤S306中,分析装置1根据被回收的对象,对所述对象容器进行更新,其中,所述对象容器中所存储的对象与移动应用在内存中的未释放对象实时对应。具体地,移动应用程序运行过程中,如果对象被收回,则该对象没有造成内存泄漏,在步骤S306中,分析装置1将所述对象从所述对象容器中实时移除,更新所述对象容器,以保证所述对象容器中所有对象均为内存中未释放的对象,并且,所述对象容器中所存储的对象与移动应用在内存中未释放的对象实时对应。例如,所述对象为图片,如果图片被回收,即调用了Bitmap的finalize方法,则分析装置1按照同样的方法将所述图片从所述对象容器中移除。

在此,被回收的对象被收回时,将所述对象从对象容器中移除,以保证该对象容器中的所有图片均为内存中未释放的图片。

优选地,所述步骤S305包括:子步骤S3051(未示出)和子步骤S3052(未示出)。

其中,在子步骤S3051中,分析装置1按照预定规则,对所述标记后的所述对象及其对应的属性进行排序;其中,所述预定规则包括以下至少任一项:

按照所述对象的生成时间对所述对象及其对象的属性进行排序;

按照所述对象的大小对所述对象及其对象的属性进行排序。

具体地,为了便于用户直观的观察当前移动应用中驻留内存的对象,在子步骤S3051中,分析装置1按照预定规则,例如按根据对象生成的时间顺序对所述对象以及所述对象的属性按照顺序或者倒序进行排序,或者根据对象的大小对所述对象以及所述对象的属性进行顺序或者倒序排序。其中,所述对象生成的时间顺序对应于所述标记的顺序。

在子步骤S3052中,分析装置1在所述对象容器中,将经过排序的所述标记后的所述对象及其对应的属性展现给搜索用户。具体地,在子步骤S3052中,分析装置1通过弹出对话框的方式,将经过排序的标记后的所述对象及其对应的属性展现给所述搜索用户;或者在子步骤S3052中,分析装置1通过将所述经过排序的所述标记后的所述对象及其对应的属性存储为文件格式的形式提供给用户,以便用户实时保存所述内存占用过程。进一步地,所述对象展现的过程是实时的,动态变化的过程,所述对象的数量、内容或者属性会随着程序的运行而不断变化。当所述对象为图片时,在步骤S305中,分析装置1对所述图片的展示如图2所示,图2示对标记后的图片以及图片属性展示的示意图。

需要注意的是,本发明可在软件和/或软件与硬件的组合体中被实施,例如,本发明的各个装置可采用专用集成电路(ASIC)或任何其他类似硬件设备来实现。在一个实施例中,本发明的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1