一种安卓应用的内存泄露检测方法及装置与流程

文档序号:11216173阅读:210来源:国知局
一种安卓应用的内存泄露检测方法及装置与流程

本发明涉及安卓系统内存管理技术领域,尤其涉及一种安卓应用的内存泄露检测方法及装置。



背景技术:

在基于安卓(android)系统的代码编写中,根据开发者的工作经验,一般对容易产生内存泄漏的代码进行处理。

目前在android应用程序开发中,对象使用后仍持有该对象的引用,使得之前分配的内存不能回收,造成了内存泄漏。这就需要开发人员对容易产生内存泄漏的代码进行额外的控制,已防止内存泄漏的产生。如context(上下文环境)的重要程度不言而喻,context有自己的生命周期,如果使用不当,一直持有该context的引用,从而导致context的存在时间超过了本身的生命周期,就会导致内存泄漏,并且如果缺少经验,开发过程中并不容易明显发现,明显的例子是使用静态属性view,或是使用handler延迟发送消息等,这都需要开发者在开发的过程中做好预防措施,但是难免也会有疏漏。

应用程序开发完成后,使用mat(eclipse的一个插件,内存分析工具)等内存分析工具对程序的内存的使用进行分析,但是上手较为麻烦,查找起来也比较消耗时间。



技术实现要素:

本发明的目的在于提供一种安卓应用的内存泄露检测方法及装置,解决现有技术中出现内存泄露会占用内存越来越多,以至于导致程序崩溃的问题。

本发明的技术方案实现如下:

本发明的一个目的在于提供一种安卓应用的内存泄露检测方法,包括:

建立一弱引用监听器,所述弱引用监听器监听当前运行的应用程序的activity组件;

当所述activity组件销毁时,检测所述activity组件是否存在引用,若存在,则触发内存回收机制,之后检测所述activity组件是否存在弱引用。

在本发明所述的内存泄露检测方法中,所述检测所述activity组件是否存在弱引用的步骤包括:

检测所述activity组件是否存在弱引用;若存在,则所述activity组件发生内存泄露;若不存在,则内存回收正常。

在本发明所述的内存泄露检测方法中,所述触发内存回收机制的步骤包括:

调用runtime.getruntime().gc()方法触发内存垃圾回收。

在本发明所述的内存泄露检测方法中,所述内存泄露检测方法还包括:

当所述activity组件发生内存泄露时,在通知栏中显示所述activity组件的引用的相关信息。

在本发明所述的内存泄露检测方法中,所述内存泄露检测方法还包括:

建立多个弱引用监听器,所述多个弱引用监听器监听当前运行的多个应用程序的activity组件。

另一方面,提供一种安卓应用的内存泄露检测装置,包括:

监听器建立模块,用于建立一弱引用监听器,所述弱引用监听器监听当前运行的应用程序的activity组件;

引用检测模块,用于当所述activity组件销毁时,检测所述activity组件是否存在引用,若存在,则触发内存回收机制,之后检测所述activity组件是否存在弱引用。

在本发明所述的内存泄露检测装置中,所述引用检测模块包括:

弱引用检测子模块,用于检测所述activity组件是否存在弱引用;若存在,则所述activity组件发生内存泄露;若不存在,则内存回收正常。

在本发明所述的内存泄露检测装置中,所述引用检测模块包括:

内存回收子模块,用于调用runtime.getruntime().gc()方法触发内存垃圾回收。

在本发明所述的内存泄露检测装置中,所述内存泄露检测装置还包括:

引用显示模块,用于当所述activity组件发生内存泄露时,在通知栏中显示所述activity组件的引用的相关信息。

在本发明所述的内存泄露检测装置中,所述监听器建立模块还用于:

建立多个弱引用监听器,所述多个弱引用监听器监听当前运行的多个应用程序的activity组件。

因此,本发明的有益效果是,通过随意设置监控对象,方便在应用程序开发中对内存泄露进行监控,该方法及装置使用简单灵活,不仅提高了程序的健壮性,还提高了工程师的开发效率。

附图说明

下面将结合附图及实施例对本发明作进一步说明,附图中:

图1为本发明提供的一种安卓应用的内存泄露检测方法流程图;

图2为本发明提供的一种安卓应用的内存泄露检测装置框图。

具体实施方式

为了对本发明的技术特征、目的和效果有更加清楚的理解,以下将对照附图详细说明本发明的具体实施方式。应当理解,以下说明仅为本发明实施例的具体阐述,不应以此限制本发明的保护范围。

本发明提供一种安卓应用的内存泄露检测方法,其目的在于,针对现有技术中出现内存泄露会占用内存越来越多,以至于导致程序崩溃的问题,通过android生命周期及弱引用的使用,在应用程序开发中对内存泄露进行监控,该方法及装置使用简单灵活,不仅提高了程序的健壮性,还提高了工程师的开发效率。其中,内存泄露是指应用对象申请了一块内存,使用完成后没有释放掉。如果程序出现了内存泄露,长时间运行后,会占用内存越来越多,可能会导致程序崩溃。本发明的安卓应用开始是基于eclipse开发,eclipse为android应用程序开发工具。同时eclipse是一个开放源代码的、基于java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建 开发环境。

参见图1,图1为本发明提供的一种安卓应用的内存泄露检测方法流程图,该方法包括以下步骤:

s1、建立一弱引用监听器,所述弱引用监听器监听当前运行的应用程序的activity组件;当程序运行的时候,该弱引用监听器会自动监听对应的应用程序。该应用程序可以随意设置,即可以随意监控想监控的对象。

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。弱引用不同于一般的引用在于,弱引用拥有短的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。即弱引用就是不保证不被垃圾回收器回收的对象,它拥有比较短暂的生命周期,在垃圾回收器扫描它所管辖的内存区域过程中,一旦发现了只具有弱引用的对象,就会回收它的内存,不过一般情况下,垃圾回收器的线程优先级很低,也就不会很快发现那些只有弱引用的对象。

activity为应用程序用于显示在屏幕上的组件。通常的,activity是android组件中最基本也是最为常见用的四大组件(activity,service服务,contentprovider内容提供者,broadcastreceiver广播接收器)之一。activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setcontentview(view)来显示指定控件。在一个android应用中,一个activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。activity之间通过intent进行通信。activity拥有四种基本状态:

1.active/running

一个新activity启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(activeorrunning)。

2.paused

当activity失去焦点,被一个新的非全屏的activity或者一个透明的activity被放置在栈顶,此时的状态叫做暂停状态(paused)。此时它依然与窗口管理器保持连接,activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。

3.stoped

如果一个activity被另外的activity完全覆盖掉,叫做停止状态(stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,stopped的activity将被强行终止掉。

4.killed

如果一个activity是paused或者stopped状态,系统可以将该activity从内存中删除,android系统采用两种方式进行删除,要么要求该activity结束,要么直接终止它的进程。当该activity再次显示给用户时,它必须重新开始和重置前面的状态。

s2、当所述activity组件销毁时(即到达killed状态时),检测所述activity组件是否存在引用,若存在,则触发内存回收机制,之后检测所述activity组件是否存在弱引用。该步骤s2包括以下子步骤s21-s24:

s21、该弱引用监听器自动监听activity组件销毁时,是否仍持有该activity的引用,以判断该activity是否发生内存泄露,若有,执行步骤s22,若否,则内存释放良好。

s22、调用runtime.getruntime().gc()方法触发内存垃圾回收。runtime.getruntime().gc()为eclipse中的一个函数。

s23、检测所述activity组件是否存在弱引用;若存在,则执行步骤s24,若不存在,则内存回收正常。

s24、所述activity组件发生内存泄露。

s3、当所述activity组件发生内存泄露时,在通知栏中显示所述activity组件的引用的相关信息。要使用消息通知栏,必须要用到两个类:notificationmanager和notification,其他notificationmanager的初始化是用 getsystemservice方法,并且通过notify方法来向android系统发送消息栏通知和显示。

优选的,所述内存泄露检测方法的另一实施例还包括:

建立多个弱引用监听器,所述多个弱引用监听器监听当前运行的多个应用程序的activity组件。当所述多个activity组件其中之一销毁时,检测所述activity组件是否存在引用,若存在,则触发内存回收机制,之后检测所述activity组件是否存在弱引用。

参见图2,图2为本发明提供的一种安卓应用的内存泄露检测装置100框图,该安卓应用的内存泄露检测装置100包括监听器建立模块1、引用检测模块2及引用显示模块3。

监听器建立模块1用于建立一弱引用监听器,所述弱引用监听器监听当前运行的应用程序的activity组件;优选的,在本发明的另一个实施例中,建立多个弱引用监听器,所述多个弱引用监听器监听当前运行的多个应用程序的activity组件。

引用检测模块2用于当所述activity组件销毁时,检测所述activity组件是否存在引用,若存在,则触发内存回收机制,之后检测所述activity组件是否存在弱引用。

所述引用检测模块2包括弱引用检测子模块及内存回收子模块。

弱引用检测子模块用于检测所述activity组件是否存在弱引用;若存在,则所述activity组件发生内存泄露;若不存在,则内存回收正常。

内存回收子模块用于调用runtime.getruntime().gc()方法触发内存垃圾回收。

引用显示模块3用于当所述activity组件发生内存泄露时,在通知栏中显示所述activity组件的引用的相关信息。

本文提供了实施例的各种操作。在一个实施例中,所述的一个或多个操作可以构成一个或多个计算机可读介质上存储的计算机可读指令,其在被电子设备执行时将使得计算设备执行所述操作。描述一些或所有操作的顺序不应当被解释为暗示这些操作必需是顺序相关的。本领域技术人员将理解具有本说明书 的益处的可替代的排序。而且,应当理解,不是所有操作必需在本文所提供的每个实施例中存在。

而且,本文所使用的词语“优选的”意指用作实例、示例或例证。奉文描述为“优选的”任意方面或设计不必被解释为比其他方面或设计更有利。相反,词语“优选的”的使用旨在以具体方式提出概念。如本申请中所使用的术语“或”旨在意指包含的“或”而非排除的“或”。即,除非另外指定或从上下文中清楚,“x使用a或b”意指自然包括排列的任意一个。即,如果x使用a;x使用b;或x使用a和b二者,则“x使用a或b”在前述任一示例中得到满足。

而且,尽管已经相对于一个或多个实现方式示出并描述了本公开,但是本领域技术人员基于对本说明书和附图的阅读和理解将会想到等价变型和修改。本公开包括所有这样的修改和变型,并且仅由所附权利要求的范围限制。特别地关于由上述组件(例如元件、资源等)执行的各种功能,用于描述这样的组件的术语旨在对应于执行所述组件的指定功能(例如其在功能上是等价的)的任意组件(除非另外指示),即使在结构上与执行本文所示的本公开的示范性实现方式中的功能的公开结构不等同。此外,尽管本公开的特定特征已经相对于若干实现方式中的仅一个被公开,但是这种特征可以与如可以对给定或特定应用而言是期望和有利的其他实现方式的一个或多个其他特征组合。而且,就术语“包括”、“具有”、“含有”或其变形被用在具体实施方式或权利要求中而言,这样的术语旨在以与术语“包含”相似的方式包括。

本发明实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。上述提到的存储介质可以是只读存储器,磁盘或光盘等。上述的各装置或系统,可以执行相应方法实施例中的方法。

综上所述,虽然本发明已以优选实施例揭露如上,但上述优选实施例并非用以限制本发明,本领域的普通技术人员,在不脱离本发明的精神和范围内, 均可作各种更动与润饰,因此本发明的保护范围以权利要求界定的范围为准。

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