一种应用内存泄露的检测方法和装置的制造方法

文档序号:10724819阅读:249来源:国知局
一种应用内存泄露的检测方法和装置的制造方法
【专利摘要】本发明实施例提供了一种应用内存泄露的检测方法和装置,该方法包括:在独立的检测应用中检测启动的目标应用;获取所述目标应用的上下文信息;将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。本发明实施例避免了破坏被测应用的完整性,提高了被测应用的稳定性,而且,由于可以保证被测应用的完整性,除了可以检测调试版本的应用的内存泄露中,也可以检测已发布的应用的内存泄露,大大提高了检测的通用性,提高了已发布的应用的稳定性,减少内存溢出问题的发生。
【专利说明】
一种应用内存泄露的检测方法和装置
技术领域
[0001]本发明涉及检测的技术领域,特别是涉及一种应用内存泄露的检测方法和一种应用内存泄露的检测装置。
【背景技术】
[0002]内存泄露(memoryleak),又称内存泄漏,是指某些对象在生命周期结束的时候没有被回收,仍然占用内存。
[0003]内存泄露是应用开发过程中比较常见的问题,严重的泄露会大量消耗内存,对应用本身的体验也会造成极大影响,甚至触发OOM(内存溢出,即内存占用量超过所分配的最大值)等异常行为。
[0004]因此,在应用的测试过程中,通常引入内存泄露检测,提高应用的稳定性和用户体验。
[0005]在一种内存泄露的检测方法中,通过专用的调试工具,如DDMS(Dalvik DebugMonitor Service,虚拟机调试监控服务)、MAT(Eclipse Memory Analyzer)等,使用DDMS的Heap(堆)检测工具,监控应用进程的Heap信息,通过手动触发内存清理操作,检测进程Heap信息的相应变化,如果Heap的总量有明显的变化,则认为存在内存泄露的可能,然后使用MAT确定导致内存泄露的调用路径。
[0006]但是,这种检测方法依赖于测试者的分析经验,手动操作,使得操作相对复杂,而且结果不够直观。
[0007]因此,测试者通常使用另外一种检测方法,在被测应用的源代码中集成一个用于检测内存泄露的数据库,如LeakCanary库,在Debug buiId(调试版本,一般在开发阶段内部使用)的应用中可以自动检测内存泄露。
[0008]如果检测到内存泄露,在通知栏提醒并展示导致内存泄露的调用路径。
[0009]这种检测方法虽然不需要测试者的手动操作,但是,用于检测内存泄露的数据库与被测应用(即被测试的应用)的耦合性较高,需要在被测应用的源代码中集成,破坏了被测应用的完整性,降低了被测应用的稳定性,因此,这种检测方式只能应用在调试版本的应用中,对于已发布的应用,由于无法将其集成,无法检测内存泄漏,具有较大的局限性。

【发明内容】

[0010]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种应用内存泄露的检测方法和相应的一种应用内存泄露的检测装置。
[0011 ]依据本发明的一个方面,提供了一种应用内存泄露的检测方法,包括:
[0012]在独立的检测应用中检测启动的目标应用;
[0013]获取所述目标应用的上下文信息;
[0014]将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。
[0015]可选地,所述检测应用注入在进程孵化器中;
[0016]所述在独立的检测应用中检测启动的目标应用的步骤包括:
[0017]当独立的检测应用获取到所述进程孵化器创建进程的消息时,获取所述进程所属目标应用的包名。
[0018]可选地,所述获取所述目标应用的上下文信息的步骤包括:
[0019]对预置的应用类或预置的活动类进行挂钩;
[0020]从所述应用类或所述活动类中获取所述包名对应的上下文信息。
[0021]可选地,所述将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露的步骤包括:
[0022]将所述目标应用作为监控对象,创建一弱引用对象;
[0023]当监控到目标应用的关闭操作时,判断所述弱引用对象是否被清除;若否,则执行内存清理操作;
[0024]当所述弱引用对象在执行内存清理操作之后未被清除时,确定内存泄露。
[0025]可选地,还包括:
[0026]当检测到内存泄露时,在日志中记录所述内存泄露的信息。
[0027]可选地,所述在日志中记录所述内存泄露的信息的步骤包括:
[0028]计算针对所述目标应用创建的弱引用对象的最短强引用路径,获得导致内存泄露的调用路径;
[0029]将导致内存泄露的调用路径写入日志中。
[0030]可选地,还包括:
[0031]将所述日志上传至数据中心。
[0032]根据本发明的另一方面,提供了一种应用内存泄露的检测装置,包括:
[0033]目标应用检测模块,用于在独立的检测应用中检测启动的目标应用;
[0034]上下文信息获取模块,用于获取所述目标应用的上下文信息;
[0035]内存泄露监控模块,用于将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。
[0036]可选地,所述检测应用注入在进程孵化器中;
[0037]所述目标应用检测模块还用于:
[0038]当独立的检测应用获取到所述进程孵化器创建进程的消息时,获取所述进程所属目标应用的包名。
[0039]可选地,所述上下文信息获取模块还用于:
[0040]对预置的应用类或预置的活动类进行挂钩;
[0041]从所述应用类或所述活动类中获取所述包名对应的上下文信息。
[0042]可选地,所述内存泄露监控模块还用于:
[0043]将所述目标应用作为监控对象,创建一弱引用对象;
[0044]当监控到目标应用的关闭操作时,判断所述弱引用对象是否被清除;若否,则执行内存清理操作;
[0045]当所述弱引用对象在执行内存清理操作之后未被清除时,确定内存泄露。
[0046]可选地,还包括:
[0047]日志记录模块,用于在检测到内存泄露时,在日志中记录所述内存泄露的信息。
[0048]可选地,所述日志记录模块还用于:
[0049]计算针对所述目标应用创建的弱引用对象的最短强引用路径,获得导致内存泄露的调用路径;
[0050]将导致内存泄露的调用路径写入日志中。
[0051 ] 可选地,还包括:
[0052]日志上传模块,用于将所述日志上传至数据中心。
[0053]本发明实施例在独立的检测应用中检测启动的目标应用,以获取目标应用的上下文信息,将所述上下文信息输入检测应用,以监控目标应用的内存泄露,在检测应用中集成用于检测内存泄露的数据库,该用于检测内存泄露的数据库经过修改,使得导致内存泄露的调用路径的解析工作可以在独立的检测应用中实现,同时,导致内存泄露的调用路径的展示不需要通过被测应用实现,这样用于检测内存泄露的数据库就无需集成在被测应用的源代码中,避免了破坏被测应用的完整性,提高了被测应用的稳定性,而且,由于可以保证被测应用的完整性,除了可以检测调试版本的应用的内存泄露中,也可以检测已发布的应用的内存泄露,大大提高了检测的通用性,提高了已发布的应用的稳定性,减少内存溢出问题的发生。
[0054]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【附图说明】
[0055]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0056]图1示出了根据本发明一个实施例的一种应用内存泄露的检测方法实施例的步骤流程图;
[0057]图2示出了根据本发明一个实施例的另一种应用内存泄露的检测方法实施例的步骤流程图;
[0058]图3示出了根据本发明一个实施例的一种应用内存泄露的检测装置实施例的结构框图;以及
[0059]图4示出了根据本发明一个实施例的另一种应用内存泄露的检测装置实施例的结构框图。
【具体实施方式】
[0060]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0061]参照图1,示出了根据本发明一个实施例的一种应用内存泄露的检测方法实施例的步骤流程图,具体可以包括如下步骤:
[0062]步骤101,在独立的检测应用中检测启动的目标应用。
[0063]在具体实现中,本发明实施例可以应用在移动设备中,例如,手机、平板电脑、智能手表等等,本发明实施例对此不加以限制。
[0064]这些移动设备的操作系统可以包括Android(安卓)、10S、Windows Phone、等等。
[0065]为使本领域技术人员更好地理解本发明实施例,在本说明书中,将Android作为操作系统的一种示例进行说明。
[0066]这些操作系统通常可以支持各种系统应用和第三方应用运行,例如,即时通讯工具、邮箱客户端、音乐播放器、支付工具等等。
[0067]这些系统应用和第三方应用可以通过应用安装包安装在操作系统中进行内存泄露的检测,例如,在Android系统中,应用安装包为APK(AndroidPackage)文件。
[0068]用于检测内存泄露的数据库需要继承在被测应用的源代码中,并在被测应用中预先注册其相关组件,通常存在两处耦合的地方:
[0069]1、输入被测应用的上下文信息(Context),用于判断是否存在可疑的导致内存泄露的调用路径;
[0070]2、通过被测应用显示导致内存泄露的调用路径。
[0071 ] 以LeakCanary为例,LeakCanary为每个创建的Activity(活动)添加一个reference监控,并提供一个唯一的key,当监控到Activity销毁时,执行一次GC(Java垃圾回收机制),然后检查这个Activity对应的reference是否被清理;如果发现存在内存泄露,就生成一个heap dump文件,然后使用HprofParser进行解析,找到对应的Leak trace(导致内存泄露的调用路径),然后以toast(—个View视图,在应用上浮动显示信息)的方式进行提示,点击后可以看到具体的Leak trace。
[0072]综上所述,LeakCanary集成在被测应用中,并在被测应用的Manifest.xml文件中预先注册LeakCanary的相关组件,親合点在于两处:
[0073]1、LeakCanary的输入为被测应用的Appl icat 1n或Acti vity的Context,用于解析Heap prof,并判断是否存在可疑的Leak trace;
[0074]2、以toast的方式进行提示。
[0075]在本发明实施例中,通过修改用于检测内存泄露的数据库的源代码,把需要预先在被测应用中注册的组件不再与被测应用发生联系,开发一个独立的检测应用,集成修改好的用于检测内存泄露的数据库。
[0076]用于检测内存泄露的数据库的源代码的修改一般包括如下两种:
[0077]1、修改检测导致内存泄露的调用路径的组件,使得在独立的检测应用中检测导致内存泄露的调用路径;
[0078]2、删去通过被测应用显示导致内存泄露的调用路径的组件。
[0079]在修改后的数据库中,导致内存泄露的调用路径的解析工作是在独立的检测应用中实现,删去显示导致内存泄露的调用路径的组件,使得导致内存泄露的调用路径的展示不需要通过被测应用实现,这样就无需集成在被测应用的源代码中。
[0080]以LeakCanary为例,原LeakCanary预先在被测应用的Mainifest.xml文件中声明HeapAnalyzerService,Di sp IayLeakServi ce 等月艮务。
[0081 ]其中,HeapAnalyzerService负责检测Leak trace,DisplayLeakService负责展不Leak trace ο
[0082]因此,在修改LeakCanary时,可以修改HeapAnalyzerService的实现,即在独立的检测应用中检测Leak trace,并且,删去DisplayLeakService。
[0083]开发一个独立的检测应用,记为Inject APK,集成修改后的LeakCanary库。
[0084]在修改后的LeakCanary,Leak trace的解析工作是在Inject APK中实现,删去DisplayLeakService,使得Leak trace的展不不通过被测应用显不在UI(User Interface,用户界面)中,这样就不需要修改被测应用的Manifest.xml文件,也就无需集成在被测应用的源代码中。
[0085]需要说明的是,检测应用的独立性,是相对于被测应用而言的,即检测应用是独立于被测应用之外的应用。
[0086]在具体实现中,被测应用作为目标应用,独立的检测应用可以在检测到该目标应用时,启动内存泄露的监控。
[0087]在本发明的一个实施例中,检测应用可以注入(inject)在进程孵化器中。
[0088]其中,进程孵化器可以用于孕育(fork)应用程序的进程以及系统服务的进程。
[0089]例如,在Android系统中,进程孵化器可以为Zygote进程,是一个应用层的程序,当ActivityManagerServi ce启动一个应用的时候,可以通过Socket与Zygote进程进行通信,请求Zygote进程fork—个子进程,作为这个即将要启动的应用的进程。
[0090]由于检测应用注入在进程孵化器中的内存空间中,因此,可以在新进程创建时,获取创建的消息。
[0091 ]当独立的检测应用获取到进程孵化器创建进程的消息时,获取进程所属目标应用的包名(Package Name)。
[0092]步骤102,获取所述目标应用的上下文信息。
[0093]在具体实现中,可以对预置的应用(Applicat1n)类或预置的活动(Activity)类进行挂钩Hook。
[0094]由于在Android系统中,创建Activity类的实例对象,对象创建完成之后,一般会执行到该类的onCreate方法,因此,可以Hook应用(Applicat1n)类或活动(Acti vity)类的onCreate ()方法。
[0095]从应用(App I icat 1n)类或活动(Activity)类中获取包名对应的上下文信息Context,作为检测LeakCanary所需要的输入信息。
[0096]步骤103,将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄
Mo
[0097]在具体实现中,可以将上下文信息(Context)作为修改后的、用于检测内存泄露的数据库(如LeakCanary)的输入,对目标应用的内存泄露进行监控。
[0098]在本发明的一个实施例中,步骤103可以包括如下子步骤:
[0099]子步骤SI I,将目标应用作为监控对象,创建一弱引用对象;
[0100]子步骤S12,当监控到目标应用的关闭操作时,判断所述弱引用对象是否被清除;若否,则执行子步骤S13;
[0101]子步骤SI3,执行内存清理操作;
[0102]子步骤S14,当所述弱引用对象在执行内存清理操作之后未被清除时,确定内存泄Mo
[0103]内存泄露,一般是由于疏忽或错误造成应用未能释放已经不再使用的内存的情况。
[0104]内存泄漏并非指内存在物理上的消失,而是应用分配某段内存后,由于设计错误,失去了对该段内存的控制,即便在生命周期结束的时候也没有回收该段内存,仍然占用该段内存。
[0105]以LeakCanary的机制为例,LeakCanary可以包括如下组件:
[0106]l、ActivityRef¥atcher
[0107]通过watchActivities方法将全局的Activity生命周期回调接口Applicat1n.ActivityLifecy c IeCal Ibacks 注册到applicat1n ο
[0108]以监控对象创建一个KeyedWeakReference弱引用对象,当方法被调用时进行回调,将弱引用对象传给Ref Watcher。
[0109]2NRefffatcher
[0110]如果弱引用对象未被回收,则触发一次GC(内存清理操作),如果弱引用对象未被回收,则可以确认内存泄露。
[0111]本发明实施例在独立的检测应用中检测启动的目标应用,以获取目标应用的上下文信息,将所述上下文信息输入检测应用,以监控目标应用的内存泄露,在检测应用中集成用于检测内存泄露的数据库,该用于检测内存泄露的数据库经过修改,使得导致内存泄露的调用路径的解析工作可以在独立的检测应用中实现,同时,导致内存泄露的调用路径的展示不需要通过被测应用实现,这样用于检测内存泄露的数据库就无需集成在被测应用的源代码中,避免了破坏被测应用的完整性,提高了被测应用的稳定性,而且,由于可以保证被测应用的完整性,除了可以检测调试版本的应用的内存泄露中,也可以检测已发布的应用的内存泄露,大大提高了检测的通用性,提高了已发布的应用的稳定性,减少内存溢出问题的发生。
[0112]参照图2,示出了根据本发明一个实施例的另一种应用内存泄露的检测方法实施例的步骤流程图,具体可以包括如下步骤:
[0113]步骤201,在独立的检测应用中检测启动的目标应用。
[0114]步骤202,获取所述目标应用的上下文信息。
[0115]步骤203,将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄
Mo
[0116]步骤204,当检测到内存泄露时,在日志中记录所述内存泄露的信息。
[0117]在具体实现中,若检测到内存泄露,则可以在日志中记录内存泄露的相关信息,以供测试者进行分析。
[0118]例如,目标应用的信息(如包名)、导致内存泄露的调用路径、环境信息(如系统版本),等等。
[0119]在本发明的一个实施例中,步骤204可以包括如下子步骤:
[0120]子步骤S21,计算针对所述目标应用创建的弱引用对象的最短强引用路径,获得导致内存泄露的调用路径;
[0121]子步骤S22,将导致内存泄露的调用路径写入日志中。
[0122]以LeakCanary的机制为例,LeakCanary 一般可以包括如下组件:
[0123]KActivityRefWatcher
[0124]通过watchActivities方法将全局的Activity生命周期回调接口Applicat1n.ActivityLifecy c IeCal Ibacks 注册到applicat1n ο
[0125]以监控对象创建一个KeyedWeakReference弱引用对象,当方法被调用时进行回调,将弱引用对象传给Ref Watcher。
[0126]2NRefffatcher
[0127]如果弱引用对象未被回收,则触发一次GC(内存清理操作),如果弱引用对象未被回收,则将内存dump出成Hprof文件。
[0128]3 NHeapDump.Listener与ServiceHeapDumpListener
[0129]ServiceHeapDumpListener实现了HeapDump.Listener接口,当RefWatcher发现可疑的对象弓丨用之后,ServiceHeapDumpListener将可疑的Hprof文件传递给HeapAnalyzerService ο
[0130]4NHeapAnalyzerService
[0131]分析对象引用,计算该引用到GC root的最短强引用路径,就是Leak trace。
[0132]步骤205,将所述日志上传至数据中心。
[0133]在本发明实施例中,可以以打点信息的方式把日志上传到数据中心(S卩服务器),以便通过web (网页)的方式进行浏览。
[0134]当然,除了将日志上传至数据中心,也可以通过其他方式进行显示,例如,导出到电脑进行显示,等等,本发明实施例对此不加以限制。
[0135]对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
[0136]参照图3,示出了根据本发明一个实施例的一种应用内存泄露的检测装置实施例的结构框图,具体可以包括如下模块:
[0137]目标应用检测模块301,用于在独立的检测应用中检测启动的目标应用;
[0138]上下文信息获取模块302,用于获取所述目标应用的上下文信息;
[0139]内存泄露监控模块303,用于将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。
[0140]在本发明的一个实施例中,所述检测应用注入在进程孵化器中;
[0141]所述目标应用检测模块301还可以用于:
[0142]当独立的检测应用获取到所述进程孵化器创建进程的消息时,获取所述进程所属目标应用的包名。
[0143]在本发明的一个实施例中,所述上下文信息获取模块302还可以用于:
[0144]对预置的应用类或预置的活动类进行挂钩;
[0145]从所述应用类或所述活动类中获取所述包名对应的上下文信息。
[0146]在本发明的一个实施例中,所述内存泄露监控模块303还可以用于:
[0147]将所述目标应用作为监控对象,创建一弱引用对象;
[0148]当监控到目标应用的关闭操作时,判断所述弱引用对象是否被清除;若否,则执行内存清理操作;
[0149]当所述弱引用对象在执行内存清理操作之后未被清除时,确定内存泄露。
[0150]参照图4,示出了根据本发明一个实施例的另一种应用内存泄露的检测装置实施例的结构框图,具体可以包括如下模块:
[0151]目标应用检测模块401,用于在独立的检测应用中检测启动的目标应用。
[0152]上下文信息获取模块402,用于获取所述目标应用的上下文信息。
[0153]内存泄露监控模块403,用于将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。
[0154]日志记录模块404,用于在检测到内存泄露时,在日志中记录所述内存泄露的信息。
[0155]日志上传模块405,用于将所述日志上传至数据中心。
[0156]在本发明的一个实施例中,所述日志记录模块404还可以用于:
[0157]计算针对所述目标应用创建的弱引用对象的最短强引用路径,获得导致内存泄露的调用路径;
[0158]将导致内存泄露的调用路径写入日志中。
[0159]对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0160]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0161]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0162]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。
[0163]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0164]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0165]本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的应用内存泄露的检测设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0166]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
[0167]本发明实施例公开了Al、一种应用内存泄露的检测方法,包括:
[0168]在独立的检测应用中检测启动的目标应用;
[0169]获取所述目标应用的上下文信息;
[0170]将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。
[0171]A2、如Al所述的方法,所述检测应用注入在进程孵化器中;
[0172]所述在独立的检测应用中检测启动的目标应用的步骤包括:
[0173]当独立的检测应用获取到所述进程孵化器创建进程的消息时,获取所述进程所属目标应用的包名。
[0174]A3、如A2所述的方法,所述获取所述目标应用的上下文信息的步骤包括:
[0175]对预置的应用类或预置的活动类进行挂钩;
[0176]从所述应用类或所述活动类中获取所述包名对应的上下文信息。
[0177]A4、如Al所述的方法,所述将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露的步骤包括:
[0178]将所述目标应用作为监控对象,创建一弱引用对象;
[0179]当监控到目标应用的关闭操作时,判断所述弱引用对象是否被清除;若否,则执行内存清理操作;
[0180]当所述弱引用对象在执行内存清理操作之后未被清除时,确定内存泄露。
[0181]A5、如Al或A2或A3或A4所述的方法,还包括:
[0182]当检测到内存泄露时,在日志中记录所述内存泄露的信息。
[0183]A6、如A5所述的方法,所述在日志中记录所述内存泄露的信息的步骤包括:
[0184]计算针对所述目标应用创建的弱引用对象的最短强引用路径,获得导致内存泄露的调用路径;
[0185]将导致内存泄露的调用路径写入日志中。
[0186]A7、如A5所述的方法,还包括:
[0187]将所述日志上传至数据中心。
[0188]本发明实施还公开了B8、一种应用内存泄露的检测装置,包括:
[0189]目标应用检测模块,用于在独立的检测应用中检测启动的目标应用;
[0190]上下文信息获取模块,用于获取所述目标应用的上下文信息;
[0191]内存泄露监控模块,用于将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。
[0192]B9、如B8所述的装置,所述检测应用注入在进程孵化器中;
[0193]所述目标应用检测模块还用于:
[0194]当独立的检测应用获取到所述进程孵化器创建进程的消息时,获取所述进程所属目标应用的包名。
[0195]B10、如B9所述的装置,所述上下文信息获取模块还用于:
[0196]对预置的应用类或预置的活动类进行挂钩;
[0197]从所述应用类或所述活动类中获取所述包名对应的上下文信息。
[0198]BI 1、如B8所述的装置,所述内存泄露监控模块还用于:
[0199]将所述目标应用作为监控对象,创建一弱引用对象;
[0200]当监控到目标应用的关闭操作时,判断所述弱引用对象是否被清除;若否,则执行内存清理操作;
[0201]当所述弱引用对象在执行内存清理操作之后未被清除时,确定内存泄露。
[0202]B12、如B8或B9或BlO或Bll所述的装置,还包括:
[0203]日志记录模块,用于在检测到内存泄露时,在日志中记录所述内存泄露的信息。
[0204]B13、如B12所述的装置,所述日志记录模块还用于:
[0205]计算针对所述目标应用创建的弱引用对象的最短强引用路径,获得导致内存泄露的调用路径;
[0206]将导致内存泄露的调用路径写入日志中。
[0207]B14、如BB12所述的装置,还包括:
[0208]日志上传模块,用于将所述日志上传至数据中心。
【主权项】
1.一种应用内存泄露的检测方法,包括: 在独立的检测应用中检测启动的目标应用; 获取所述目标应用的上下文信息; 将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。2.如权利要求1所述的方法,其特征在于,所述检测应用注入在进程孵化器中; 所述在独立的检测应用中检测启动的目标应用的步骤包括: 当独立的检测应用获取到所述进程孵化器创建进程的消息时,获取所述进程所属目标应用的包名。3.如权利要求2所述的方法,其特征在于,所述获取所述目标应用的上下文信息的步骤包括: 对预置的应用类或预置的活动类进行挂钩; 从所述应用类或所述活动类中获取所述包名对应的上下文信息。4.如权利要求1所述的方法,其特征在于,所述将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露的步骤包括: 将所述目标应用作为监控对象,创建一弱引用对象; 当监控到目标应用的关闭操作时,判断所述弱引用对象是否被清除;若否,则执行内存清理操作; 当所述弱引用对象在执行内存清理操作之后未被清除时,确定内存泄露。5.如权利要求1或2或3或4所述的方法,其特征在于,还包括: 当检测到内存泄露时,在日志中记录所述内存泄露的信息。6.如权利要求5所述的方法,其特征在于,所述在日志中记录所述内存泄露的信息的步骤包括: 计算针对所述目标应用创建的弱引用对象的最短强引用路径,获得导致内存泄露的调用路径; 将导致内存泄露的调用路径写入日志中。7.如权利要求5所述的方法,其特征在于,还包括: 将所述日志上传至数据中心。8.一种应用内存泄露的检测装置,包括: 目标应用检测模块,用于在独立的检测应用中检测启动的目标应用; 上下文信息获取模块,用于获取所述目标应用的上下文信息; 内存泄露监控模块,用于将所述上下文信息输入所述检测应用,以监控所述目标应用的内存泄露。9.如权利要求8所述的装置,其特征在于,所述检测应用注入在进程孵化器中; 所述目标应用检测模块还用于: 当独立的检测应用获取到所述进程孵化器创建进程的消息时,获取所述进程所属目标应用的包名。10.如权利要求9所述的装置,其特征在于,所述上下文信息获取模块还用于: 对预置的应用类或预置的活动类进行挂钩; 从所述应用类或所述活动类中获取所述包名对应的上下文信息。
【文档编号】G06F11/36GK106095689SQ201610475164
【公开日】2016年11月9日
【申请日】2016年6月24日
【发明人】姜阳阳
【申请人】北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1