CN107015866B - 一种数据处理方法及装置 - Google Patents
一种数据处理方法及装置 Download PDFInfo
- Publication number
- CN107015866B CN107015866B CN201710177873.3A CN201710177873A CN107015866B CN 107015866 B CN107015866 B CN 107015866B CN 201710177873 A CN201710177873 A CN 201710177873A CN 107015866 B CN107015866 B CN 107015866B
- Authority
- CN
- China
- Prior art keywords
- class
- task
- thread
- thread task
- internal
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
Abstract
本发明实施例公开了一种数据处理方法及装置,所述方法包括:获取数据处理请求,所述数据处理请求指示待处理的线程任务;判断所述线程任务中是否存在引用了外部类的对象的内部类;若存在所述内部类,则解除所述内部类对所述对象的引用,得到解除引用后的线程任务;对所述解除引用后的线程任务进行处理。由此,通过解除内部类对外部类的对象的引用,从而使得外部类的对象的引用不再被内部类所持有,可以使得垃圾回收机制能够及时地将外部类的对象回收,以释放外部类的对象的内存空间,从而减少内存泄漏。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种数据处理方法及装置。
背景技术
在java应用程序的开发中,为了便于引用外部类作用域内的数据,常常会使用到非静态内部类(包括匿名内部类),例如,在使用Handler(处理机)将线程任务传递加入消息队列中时,或者当需要频繁启动某个页面,为了避免重复创建相同的数据资源,也会在用于实现页面的Activtiy(活动)的内部创建非静态内部类。
java的垃圾回收机制(Garbage Collection,GC)只回收没有被引用或根集不可达的对象。在对现有技术的研究和实践过程中,本发明的发明人发现:
非静态内部类会隐式地持有一个外部类的对象的引用,而该外部类的对象的引用与否对实现非静态内部类的功能一般无影响,换句话而言,执行非静态内部类的程序通常不需要持有该外部类的对象的引用,但由于一个内部类为非静态内部类,因而导致该非静态内部类会隐式地持有外部类的对象的引用,而由于非静态内部类隐式地持有外部类的对象的引用,因此在非静态内部类的生命周期内,即使外部类的对象已经执行完成,但由于外部类的对象的引用始终被非静态内部类所持有,造成了外部类的对象不满足GC回收条件,导致GC无法回收外部类的对象,而与外部类的对象相关的资源也就不会被GC回收,容易造成严重的内存泄漏,从而导致系统可用的内存越来越少,最终造成系统崩溃。
发明内容
本发明实施例提供一种数据处理方法及装置,能够自动解决由内部类持有外部类的对象的引用而产生的内存泄漏问题,减少内存泄漏,提高应用程序的开发效率。
本发明实施例提供一种数据处理方法,包括:
获取数据处理请求,所述数据处理请求指示待处理的线程任务;
判断所述线程任务中是否存在引用了外部类的对象的内部类;
若存在所述内部类,则解除所述内部类对所述对象的引用,得到解除引用后的线程任务;
对所述解除引用后的线程任务进行处理。
本发明实施例还提供一种数据处理装置,包括:
获取模块,用于获取数据处理请求,所述数据处理请求指示待处理的线程任务;
第一判断模块,用于判断所述线程任务中是否存在引用了外部类的对象的内部类;
解除模块,用于若存在所述内部类,则解除所述内部类对所述对象的引用,得到解除引用后的线程任务;
处理模块,用于对所述解除引用后的线程任务进行处理。
本发明实施例的数据处理方法中,在根据数据请求调用生成的线程任务后,判断该线程任务是否存在引用了外部类的对象的内部类,当存在时,则解除内部类对外部类的对象的引用,从而使得外部类的对象的引用不再被内部类所持有,从而使得外部类的对象的回收不会受内部类的生命周期的影响,可以使得垃圾回收机制能够及时地将外部类的对象回收,以释放外部类的对象的内存空间,从而减少内存泄漏,另外,通过本发明实施例,通过对线程任务的内部类的引用关系进行判断,以根据判断结果自动解除内部类对外部类的对象的引用,而不需要手动解除,由此可以自动解决内部类持有外部类的对象的引用而造成的内存泄漏的问题,提高开发效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的数据处理方法的场景示意图;
图2是本发明实施例提供的数据处理方法的一流程图;
图3是本发明实施例提供的数据处理方法的另一流程图;
图4是本发明实施例提供的数据处理装置的一结构示意图;
图5是本发明实施例提供的数据处理装置的另一结构示意图;
图6是本发明实施例提供的终端的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在java程序中,通过垃圾回收机制(Garbage Collection,GC)自动管理内存的回收,通过GC自动检测对象是否被引用,若检测到对象不再被任何引用所指向,则GC会将该对象回收,也即将分配给该对象的内存空间释放,由此不需要开发人员手动清理内存,使得内存释放更及时,提高程序运行效率。而非静态内部类会隐式地持有外部类的对象的引用,导致外部类的对象无法被GC回收,从而造成内存泄漏,内存泄漏是指已经使用完毕的内存空间没有得到释放。
另外,为便于理解本发明,下面对本发明所涉及的一些关于java的类的定义做简单介绍:
普通类是指没有内部类的类。
内部类可以理解为在一个类的内部定义另一个类,外部类则是相对于内部类而言,例如,在java程序中,定义了一个类为A,在A类的内部定义了另外一个类B,例如可以在A类中直接定义B类,或者在A类的方法中定义B类,等等,则A类为B类的外部类,B类为A类的内部类。
其中,内部类又可分为静态内部类和非静态内部类,两者的区别主要在于,静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性);静态内部类只能访问外部类的静态成员,而非静态内部类可以访问外部类的所有成员;静态内部类的对象可以直接生成而不需要通过外部类的对象生成,而非静态内部类需要通过外部类的对象实例生成内部类对象。非静态内部类例如包括成员内部类、匿名内部类以及局部内部类,等等。
通过本发明,可以自动解除内部类对外部类的对象的引用关系链,从而可以使得外部类的对象及时被回收,减少内存泄漏。
本发明实施例提供一种数据处理方法及装置。
本发明实施例中,数据处理方法可以适用于各应用的数据处理,例如即时通讯应用、音乐播放应用、游戏应用等等。数据处理装置可以集成在终端,比如智能手机、笔记本电脑、平板电脑等,用于对应用的数据进行处理,其中,数据处理装置可以配置为基于java语言环境的系统,例如安卓(Android)系统等,数据处理装置中的各应用例如为基于java语言开发的安卓应用,在本发明实施例中,均以具有安卓系统的数据处理装置为例进行描述。
例如,如图1所示,该数据处理装置可以获取数据处理请求,数据处理请求指示待处理的线程任务,其中,数据处理请求可以来自用户对应用的操作,比如,如果用户请求查看即时通讯信息,则可以通过点击打开即时通讯应用的聊天窗口以发送查看请求,根据用户的操作指令获取数据处理请求,数据处理请求即是指为了响应用户的操作指令而请求处理相关的线程任务。判断线程任务中是否存在引用了外部类的对象的内部类,若存在该内部类,则解除该内部类对外部类的对象的引用,得到解除引用后的线程任务,从而对解除引用后的线程任务进行处理,若不存在该内部类,则可以按照线程任务的正常处理方式对线程任务进行处理,例如直接执行该线程任务以实现对用户的操作指令的响应,或者将该线程任务加入消息列表中等待执行。
以下分别进行详细说明。需说明的是,以下实施例的序号不作为对实施例优选顺序的限定。
实施例一、
本实施例将从数据处理装置的角度进行描述,该数据处理装置可以集成在终端中,该终端例如可以是平板电脑、手机、笔记本电脑或电子阅读器等等。
一种数据处理方法,包括:获取数据处理请求,数据处理请求指示处理事件,根据数据处理请求调用生成的线程任务,判断线程任务是否存在引用了外部类的对象的内部类,若存在该内部类,则解除内部类对对象的引用,得到解除引用后的线程任务,根据解除引用后的线程任务对处理事件进行处理。
如图2所示,该数据处理方法的具体流程可以如下:
步骤S201:获取数据处理请求,数据处理请求指示待处理的线程任务。
数据处理请求可以来自用户对应用的操作,比如,如果用户请求查看即时通讯信息,则可以通过点击打开即时通讯应用的聊天窗口以发送查看请求,根据用户的操作指令获取数据处理请求,数据处理请求即是指为了响应用户的操作指令而请求处理相关的线程任务。其中,数据处理请求携带线程任务的标识,例如线程任务的类名等,以指示待处理的线程任务。线程任务为数据处理请求所请求处理的相关数据,为用于实现特定功能或目的的程序代码。
步骤S202:判断线程任务中是否存在引用了外部类的对象的内部类。
其中,可以通过多种方式判断线程任务中是否存在引用了外部类的对象的内部类,例如,可以根据线程任务中的内部类的类型进行判断,具体而言,判断线程任务中是否存在引用了外部类的对象的内部类,具体包括:判断线程任务中是否存在非静态内部类,当存在非静态内部类,则判断线程任务中存在引用了外部类的对象的内部类,若不存在非静态内部类,则判断线程任务中不存在引用了外部类的对象的内部类。
非静态内部类会隐式地持有外部类的对象的引用,因此通过判断内部类的类型可以判断线程任务中是否存在引用了外部类的对象的内部类。
或者,还可以通过获取线程任务中各成员(类)的引用关系判断线程任务是否存在引用了外部类的对象的内部类,例如,获取线程任务各成员的引用对象,判断该对象是否为外部类的对象,当判断该对象为外部类的对象,则判判断线程任务中存在引用了外部类的对象的内部类,否则判断为不存在。
步骤S203:若存在引用了外部类的对象的内部类,则解除内部类对外部类的对象的引用,得到解除引用后的线程任务。
其中解除引用后的线程任务是指解除内部类对外部类的对象的引用后的线程任务,可以通过多种方式解除内部类(非静态内部类)对外部类的对象的引用,为便于描述,下文中,将引用了外部类的对象的内部类描述为非静态内部类。
例如,在一种方式中,具体的步骤包括:获取非静态内部类中指向外部类的对象的引用变量,将引用变量的值置为空,从而得到解除引用后的线程任务。其中,该引用变量即是内部类中引用了外部类的对象的变量,在本实施例中,通过反射的方式获取该引用变量。反射的方式是指java中的反射机制,通过该反射机制可以在应用的运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法。因此,通过反射的方式可以获取内部类中指向外部类的对象的引用变量。
通过将该引用变量的值置为空,即意味着该引用变量不再指向外部类的对象,从而可以解除非静态内部类对外部类的对象的引用,而由于非静态内部类所实现的功能(也即执行非静态内部类的程序的过程)通常不需要依赖外部类的对象的引用,因此即使解除非静态内部类和外部类的对象之间的引用关系,也不会影响非静态内部类功能的实现。
又如,在另一种方式中,还可以通过将非静态内部类设为静态内部类的方式解除内部类对外部类的对象的引用,具体而言,若线程任务中存在非静态内部类,则根据预设策略将非静态内部类修改为静态内部类,由于静态内部类不持有对外部类的对象的引用,由此可以解除内部类对外部类的对象的引用。
步骤S204:对解除引用后的线程任务进行处理。
其中,对解除引用后的线程任务的处理例如可以包括将解除引用后的线程任务加入主线程的消息队列中以等待主线程执行,或者直接调用主线程执行解除引用后的线程任务,其中可以根据线程任务的类型或者线程任务的执行主体确定对解除引用后的线程任务的处理方式,例如若线程任务为Handler传递的具有匿名内部类的Runnable(多线程接口)任务,则将处理后的Runnable任务加入主线程的消息队列中,若线程任务为主线程执行的任务,则可以直接调用主线程执行解除引用后的线程任务。
其中,在步骤S202中,若判断线程任务中不存在引用了外部类的对象的内部类,则将线程任务加入消息队列中以等待主线程处理,或者直接调用主线程执行该线程任务。
本实施例中,当判断线程任务中存在引用了外部类的对象的内部类,则解除内部类对外部类的对象的引用,由此可以使得外部类的对象的回收不受内部类的生命周期的影响,使得垃圾回收机制能够及时地将外部类的对象回收,以释放更多内存,从而减少内存泄漏,降低系统因内存不足而崩溃的几率。另外,本实施例中,通过对线程任务的内部类的引用关系进行自动检测,以根据检测结果自动解除内部类对外部类的对象的引用,从而可以自动解决因内部类持有外部类的对象的引用而导致内存泄漏的问题,无需开发人员手动修改程序代码,可以降低应用的开发成本,提高应用的开发效率。
实施例二
根据实施例一所描述的方法,以下将举例做进一步说明。
本实施例中,以解决具有匿名内部类的Runnable任务而造成的内存泄漏为例进行描述。
在java的Handler(处理机)机制中,当需要实现多线程时,常常会利用Handler将Runnable接口添加到主线程的消息队列中,以等待主线程执行,从而实现多线程。开发人员在开发应用的时候,一般通过以下方式向主线程的消息队列添加一个Runnable接口:
Handler.post(new Runnable());
其中,上面的代码表明向主线程的消息队列添加一个具有匿名内部类的Runnable任务,其中“new”表明将Runnable接口定义为匿名内部类,即该Runnable任务中存在匿名内部类,匿名内部类会隐式地持有外部类的对象的引用。若应用在运行过程中,直接执行该Runnable任务,则将导致外部类的对象无法被垃圾回收机制及时回收,造成内存泄漏。通过本实施例,可以自动解决由于匿名内部类的Runnable任务持有外部类的对象的引用而造成的内存泄漏问题,无需开发人员手动修改代码。
参阅图3,本发明实施例的数据处理方法具体包括以下步骤:
步骤S301:获取数据处理请求,数据处理请求指示待处理的线程任务。
步骤S302:判断线程任务是否为具有匿名内部类的Runnable任务,以判断线程任务中是否存在引用了外部类的对象的内部类。
其中,若线程任务为具有匿名内部类的Runnable任务,则判断为线程任务中存在引用了外部类的对象的内部类,否则判断为不存在。
步骤S303:若线程任务为具有匿名内部类的Runnable任务,则获取匿名内部类中指向外部类的对象的引用变量,并将引用变量置为空,得到解除引用后的Runnable任务,并且生成预定义类,将解除引用后的Runnable任务封装为预定义类的对象,预定义类的引用类型为弱引用、软引用或虚引用。
在本实施例中,预定义类的引用类型为弱引用,当线程任务为具有匿名内部类的Runnable任务,则通过预定义类对解除引用后的Runnable任务进行封装,将Runnable任务封装为预定义类的对象,具体如下:
class Job extends WeakReference<Object>implements Runnable{
public Runnable mJob;
}
其中,上述代码中,生成的预定义类为Job类,Job类继承了弱引用类WeakReference,从而Job类对其对象的引用为弱引用,通过将Runnable任务封装在Job类中,以实现多线程的Runnable接口。
此外,当线程任务为具有匿名内部类的Runnable任务,则判断线程任务中存在引用了外部类的对象的内部类,该内部类即为匿名内部类,以上述例子来说,Runnable接口(即“Runnable()”)被定义为匿名内部类,换句话而言,Runnable接口持有对外部类的对象的引用,通过获取Runnable接口中指向外部类的对象的引用变量,并将该引用变量的值置为空,从而解除匿名内部类的Runnable接口对外部类的对象的引用关系。
其中,获取匿名内部类中指向外部类的对象的引用变量,并将该引用变量的值置为空的步骤,可以和上述Runnable任务的封装步骤同时进行,也可以是先后进行,先后的顺序可以根据需要进行设置,例如当判断线程任务为具有匿名内部类的Runnable任务,则可以在解除Runnable任务的匿名内部类和外部类的引用关系的同时,将Runnable任务进行封装,或者可以在解除引用关系后将接触引用关系的Runnable任务进行封装,或者将Runnable封装之后再解除引用关系。
通过将匿名内部类中指向外部类的对象的引用变量的值置为空,可以解除Runnable任务与外部类之间的引用关系,从而使得垃圾回收机制能够及时回收外部类的对象。
其中,当线程任务不是具有匿名内部类的Runnable任务,则将线程任务直接添加到主线程的消息队列中,以等待主线程从消息队列中取出该线程任务并做相应处理,例如主线程直接执行该线程任务或者发给其他线程执行该线程任务。
步骤S304:将封装后的Runnable任务添加到主线程的消息队列中,以处理封装后的Runnable任务。
消息队列用于存放等待主线程处理的消息或任务。
步骤S305:调用主线程从消息队列中读取封装后的Runnable任务,并根据预定义类的引用类型,判断预定义类的对象是否被回收,若预定义类的对象没有被回收,则使用主线程对封装后的Runnable任务进行处理。
其中,使主线程对处理后的Runnable任务进行处理例如包括使用主线程执行封装后的Runnable任务,或者将封装后的Runnable任务发送给其他线程执行。其中使用主线程对封装后的Runnable任务进行处理具体是指使用主线程执行封装在Job类中的Runnable任务。
本实施例中,由于Job类的引用类型为弱引用,因此在没有其他强引用的情况下,一旦被垃圾回收机制检测,则Job类的对象将会被垃圾回收机制回收。本实施例中,通过Job类的弱引用,判断Job类的对象是否被回收。由于Runnable任务整个作为Job类的对象封装在Job类中,因此当Job类的对象被回收,则无需再对Runnable任务进行处理,若Job类的对象没有被回收,则使用主线程执行封装在Job类中的Runnable任务。
其中,当Job类的引用类型为软引用或虚引用时,则根据软引用或虚引用的引用类型判断Job类的对象是否被回收。
本实施例,不仅能够自动解除Runnable任务中的匿名内部类与外部类之间的引用,以减少内存泄漏,且通过预定义的Job类,并将该job类设置为继承弱引用类,由此根据弱引用类可以自动判断Job类的对象是否被回收,以决定是否需要执行Runnable任务。
实施例三、
为了更好地实施上述方法,本发明实施例还提供一种数据处理装置,该数据处理装置具体可以集成在终端中,比如智能手机、平板电脑等。
如图4所示,本实施例的数据处理装置包括获取模块401、第一判断模块402、解除模块403以及处理模块404。
其中,获取模块401用于获取数据处理请求,数据处理请求指示待处理的线程任务。
数据处理请求可以来自用户对应用的操作,比如,如果用户请求查看即时通讯信息,则可以通过点击打开即时通讯应用的聊天窗口以发送查看请求,根据用户的操作指令获取数据处理请求,数据处理请求即是指为了响应用户的操作指令而请求处理相关的线程任务。其中,数据处理请求携带线程任务的标识,例如线程任务的类名等,以指示待处理的线程任务。线程任务为数据处理请求所请求处理的相关数据,为用于实现特定功能或目的的程序代码。
第一判断模块402用于判断线程任务中是否存在引用了外部类的对象的内部类。
本实施例中,根据线程任务中的内部类的类型进行判断。具体而言,第一判断模块402具体用于判断线程任务中是否存在非静态内部类,当存在非静态内部类,则判断线程任务中存在引用了外部类的对象的内部类,若不存在非静态内部类,则判断线程任务中不存在引用了外部类的对象的内部类。
非静态内部类会隐式地持有外部类的对象的引用,因此通过判断内部类的类型可以判断线程任务中是否存在引用了外部类的对象的内部类。
解除模块403用于若线程任务中存在引用了外部类的对象的内部类,则解除内部类对外部类的对象的引用,得到解除引用后的线程任务。
其中,可以通过多种方式解除内部类(非静态内部类)对外部类的对象的引用,为便于描述,下文中,将引用了外部类的对象的内部类描述为非静态内部类。
例如,在一种方式中,解除模块403具体用于获取非静态内部类中指向外部类的对象的引用变量,并将引用变量的值置为空,从而得到解除引用后的线程任务。其中,该引用变量即是内部类中引用了外部类的对象的变量,在本实施例中,通过反射的方式获取该引用变量。反射的方式是指java中的反射机制,通过该反射机制可以在应用的运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法。因此,通过反射的方式可以获取内部类中指向外部类的对象的引用变量。
通过将该引用变量的值置为空,即意味着该引用变量不再指向外部类的对象,从而可以解除非静态内部类对外部类的对象的引用。
处理模块404用于对解除引用后的线程任务进行处理。
其中,对解除引用后的线程任务的处理包括将线程任务加入主线程的消息队列中以等待主线程执行,或者直接调用主线程执行解除引用后的线程任务,其中可以根据线程任务的类型或者线程任务的执行主体确定对解除引用后的线程任务的处理方式,例如若线程任务为Handler传递的具有匿名内部类的Runnable(多线程接口)任务,则将处理后的Runnable任务加入主线程的消息队列中,若线程任务为主线程执行的任务,则直接调用主线程执行解除引用后的线程任务。
其中,若第一判断模块402判断线程任务中不存在引用了外部类的对象的内部类,则处理模块404还用于将线程任务加入消息队列中以等待主线程处理,或者直接调用主线程执行该线程任务。
本实施例中,当判断线程任务中存在引用了外部类的对象的内部类,则解除内部类对外部类的对象的引用,由此可以使得外部类的对象的回收不受内部类的生命周期的影响,使得垃圾回收机制能够及时地将外部类的对象回收,以释放更多内存,从而减少内存泄漏,降低系统因内存不足而崩溃的几率。另外,本实施例中,通过对线程任务的内部类的引用关系进行自动检测,以根据检测结果自动解除内部类对外部类的对象的引用,从而可以自动解决因内部类持有外部类的对象的引用而导致内存泄漏的问题,无需开发人员手动修改程序代码,可以应用的开发成本,提高应用的开发效率。
实施例四、
根据上述实施例三所描述的数据处理装置,以下将举例做进一步描述。
本实施例的该数据处理装置具体可以集成在终端中,比如智能手机、平板电脑等。
如图5所示,其中图5和图4中相同标号的元件作用相同,本实施例中,数据处理装置进一步还包括封装模块501、调用模块502以及第二处理模块503。
本实施例中,线程任务例如为需要通过Handle发送至主线程的消息队列中的线程任务。其中,封装模块501用于当线程任务中存在引用了外部类的对象的内部类时,生成预定义类,并将解除引用后的线程任务封装为预定义类的对象。该预定义类的引用类型可以是弱引用、软引用或虚引用。
处理模块404具体用于将封装后的线程任务加入主线程的消息队列中,以对封装后的线程任务进行处理。
其中,调用模块502用于调用主线程从消息队列中读取封装后的线程任务。
第二处理模块503用于根据预定义类的引用类型,判断预定义类的对象是否被回收,若预定义类的对象没有被回收,则使用主线程对封装后的线程任务进行处理。其中,若预定义类的对象已被回收,则无需再对封装后的线程任务进行处理。
通过本实施例,可以自动判断预定义类的对象是否被回收,进而决定是否需要执行线程任务。
实施例五、
相应的,本发明实施例还提供一种终端,如图6所示,该终端可以包括射频(RF,Radio Frequency)电路601、包括有一个或一个以上计算机可读存储介质的存储器602、输入单元603、显示单元604、传感器605、音频电路606、无线保真(WiFi,Wireless Fidelity)模块607、包括有一个或者一个以上处理核心的处理器608、以及电源609等部件。本领域技术人员可以理解,图6中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
RF电路601可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器608处理;另外,将涉及上行的数据发送给基站。通常,RF电路601包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM,Subscriber Identity Module)卡、收发信机、耦合器、低噪声放大器(LNA,Low Noise Amplifier)、双工器等。此外,RF电路601还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(GSM,Global System of Mobile communication)、通用分组无线服务(GPRS,GeneralPacket Radio Service)、码分多址(CDMA,Code Division Multiple Access)、宽带码分多址(WCDMA,Wideband Code Division Multiple Access)、长期演进(LTE,Long TermEvolution)、电子邮件、短消息服务(SMS,Short Messaging Service)等。
存储器602可用于存储软件程序以及模块,处理器608通过运行存储在存储器602的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器602可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器602可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器602还可以包括存储器控制器,以提供处理器608和输入单元603对存储器602的访问。
输入单元603可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,在一个具体的实施例中,输入单元603可包括触敏表面以及其他输入设备。触敏表面,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面上或在触敏表面附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器608,并能接收处理器608发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面。除了触敏表面,输入单元603还可以包括其他输入设备。具体地,其他输入设备可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元604可用于显示由用户输入的信息或提供给用户的信息以及终端的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元604可包括显示面板,可选的,可以采用液晶显示器(LCD,Liquid Crystal Display)、有机发光二极管(OLED,Organic Light-Emitting Diode)等形式来配置显示面板。进一步的,触敏表面可覆盖显示面板,当触敏表面检测到在其上或附近的触摸操作后,传送给处理器608以确定触摸事件的类型,随后处理器608根据触摸事件的类型在显示面板上提供相应的视觉输出。虽然在图6中,触敏表面与显示面板是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面与显示面板集成而实现输入和输出功能。
终端还可包括至少一种传感器605,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板的亮度,接近传感器可在终端移动到耳边时,关闭显示面板和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路606、扬声器,传声器可提供用户与终端之间的音频接口。音频电路606可将接收到的音频数据转换后的电信号,传输到扬声器,由扬声器转换为声音信号输出;另一方面,传声器将收集的声音信号转换为电信号,由音频电路606接收后转换为音频数据,再将音频数据输出处理器608处理后,经RF电路601以发送给比如另一终端,或者将音频数据输出至存储器602以便进一步处理。音频电路606还可能包括耳塞插孔,以提供外设耳机与终端的通信。
WiFi属于短距离无线传输技术,终端通过WiFi模块607可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图6示出了WiFi模块607,但是可以理解的是,其并不属于终端的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器608是终端的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器602内的软件程序和/或模块,以及调用存储在存储器602内的数据,执行终端的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器608可包括一个或多个处理核心;优选的,处理器608可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器608中。
终端还包括给各个部件供电的电源609(比如电池),优选的,电源可以通过电源管理系统与处理器608逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源609还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
尽管未示出,终端还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端中的处理器608会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器602中,并由处理器608来运行存储在存储器602中的应用程序,从而实现各种功能:
获取数据处理请求,数据处理请求指示待处理的线程任务,其中,数据处理请求可以来自用户对应用的操作,比如,如果用户请求查看即时通讯信息,则可以通过点击打开即时通讯应用的聊天窗口以发送查看请求,根据用户的操作指令获取数据处理请求,数据处理请求即是指为了响应用户的操作指令而请求处理相关的线程任务。
判断线程任务中是否存在引用了外部类的对象的内部类,若存在该内部类,则解除该内部类对外部类的对象的引用,得到解除引用后的线程任务,从而对解除引用后的线程任务进行处理。
其中,可以通过获取内部类中指向外部类的对象的引用变量,并将该引用变量的值置为空,从而解除内部类对外部类的对象的引用。进一步地,可以通过通过反射的方式获取内部类中指向外部类的对象的引用变量。
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
由上可知,当判断线程任务中存在引用了外部类的对象的内部类,则解除内部类对外部类的对象的引用,由此可以使得外部类的对象的回收不受内部类的生命周期的影响,使得垃圾回收机制能够及时地将外部类的对象回收,以释放更多内存,从而减少内存泄漏,降低系统因内存不足而崩溃的几率。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,RandomAccess Memory)、磁盘或光盘等。
以上对本发明实施例所提供的一种浏览器页面数据过滤方法、装置和系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (6)
1.一种数据处理方法,其特征在于,包括:
获取数据处理请求,所述数据处理请求指示待处理的线程任务;
获取所述线程任务中类的引用对象,判断所述线程任务中是否存在引用了外部类的对象的内部类;
若所述线程任务中类的引用对象为外部类的对象,则所述线程任务中存在引用了外部类的对象的内部类;
若存在所述内部类,则解除所述内部类对所述对象的引用,得到解除引用后的线程任务;
生成预定义类,将所述解除引用后的线程任务封装为所述预定义类的对象,所述预定义类的引用类型为弱引用、软引用或虚引用,所述预定义类的引用类型用于判断所述预定义类的对象是否被回收;
将封装后的线程任务加入主线程的消息队列中,以根据所述预定义类的引用类型处理所述解除引用后的线程任务,所述消息队列用于存放等待主线程处理的任务;
调用主线程从所述消息队列中读取所述封装后的线程任务;
根据所述预定义类的引用类型,判断所述预定义类的对象是否被回收;
若所述预定义类的对象没有被回收,则使用主线程对所述封装后的线程任务进行处理。
2.根据权利要求1所述的方法,其特征在于,所述解除所述内部类对所述对象的引用,得到解除引用后的线程任务,包括:
获取所述内部类中指向所述外部类的对象的引用变量;
将所述引用变量的值置为空,得到解除引用后的线程任务。
3.根据权利要求2所述的方法,其特征在于,所述获取所述内部类中指向所述外部类的对象的引用变量,包括:
通过反射的方式获取所述内部类中指向所述外部类的对象的引用变量。
4.一种数据处理装置,其特征在于,包括:
获取模块,用于获取数据处理请求,所述数据处理请求指示待处理的线程任务;
第一判断模块,用于获取所述线程任务中类的引用对象,判断所述线程任务中是否存在引用了外部类的对象的内部类;
第一判断模块,还用于若所述线程任务中类的引用对象为外部类的对象,则所述线程任务中存在引用了外部类的对象的内部类;
解除模块,用于若存在所述内部类,则解除所述内部类对所述对象的引用,得到解除引用后的线程任务;
封装模块,用于生成预定义类,并将所述解除引用后的线程任务封装为所述预定义类的对象,所述预定义类的引用类型为弱引用、软引用或虚引用,所述预定义类的引用类型用于判断所述预定义类的对象是否被回收;
处理模块,用于将封装后的线程任务加入主线程的消息队列中,以根据所述预定义类的引用类型处理所述解除引用后的线程任务,所述消息队列用于存放等待主线程处理的任务;
第二处理模块,用于调用主线程从所述消息队列中读取所述封装后的线程任务;
第二处理模块,还用于根据所述预定义类的引用类型,判断所述预定义类的对象是否被回收;
第二处理模块,还用于若所述预定义类的对象没有被回收,则使用主线程对所述封装后的线程任务进行处理。
5.根据权利要求4所述的数据处理装置,其特征在于,所述解除模块具体用于:
获取所述内部类中指向所述外部类的对象的引用变量;
将所述引用变量的值置为空,得到解除引用后的线程任务。
6.根据权利要求5所述的数据处理装置,其特征在于,所述解除模块具体用于通过反射的方式获取所述内部类中指向所述外部类的对象的引用变量。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710177873.3A CN107015866B (zh) | 2017-03-23 | 2017-03-23 | 一种数据处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710177873.3A CN107015866B (zh) | 2017-03-23 | 2017-03-23 | 一种数据处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107015866A CN107015866A (zh) | 2017-08-04 |
CN107015866B true CN107015866B (zh) | 2022-05-06 |
Family
ID=59440029
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710177873.3A Active CN107015866B (zh) | 2017-03-23 | 2017-03-23 | 一种数据处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107015866B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110764739A (zh) * | 2018-07-27 | 2020-02-07 | 武汉斗鱼网络科技有限公司 | 一种静态方法修改非静态对象的方法 |
CN109739853A (zh) * | 2018-12-21 | 2019-05-10 | 北京金山安全软件有限公司 | 数组处理方法、装置、电子设备及存储介质 |
CN110457152B (zh) * | 2019-07-11 | 2022-12-30 | 贵阳语玩科技有限公司 | 一种用代理模式解决内存泄露的系统和方法 |
CN112015395B (zh) * | 2020-08-28 | 2023-04-07 | 中移(杭州)信息技术有限公司 | 防止内存泄漏方法、装置及计算机可读存储介质 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102722432B (zh) * | 2011-03-29 | 2016-02-24 | 国际商业机器公司 | 追踪内存访问的方法和装置 |
CN104423996B (zh) * | 2013-09-04 | 2019-02-01 | 腾讯科技(深圳)有限公司 | 视图刷新方法和装置 |
CN106598725A (zh) * | 2016-10-31 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 一种基于Android的Handler防内存泄漏装置及方法 |
CN106528444A (zh) * | 2016-12-05 | 2017-03-22 | 北京金和网络股份有限公司 | 内存缓存对象自动管理方法 |
-
2017
- 2017-03-23 CN CN201710177873.3A patent/CN107015866B/zh active Active
Non-Patent Citations (2)
Title |
---|
"Java终结器的分析";夏永恒等;《北京交通管理干部学院学报》;20071231;第17卷(第3期);第五章 * |
"移动应用程序内存泄露机制分析与检测方案设计";朱洪军等;《计算机工程与应用》;20160930;第52卷(第17期);第29-35页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107015866A (zh) | 2017-08-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10437631B2 (en) | Operating system hot-switching method and apparatus and mobile terminal | |
CN105278937B (zh) | 一种显示弹出框消息的方法及装置 | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN103942113B (zh) | 系统重启原因的检测方法、装置及终端设备 | |
CN103544033B (zh) | 应用程序回退方法、装置及相关设备 | |
EP3937016A1 (en) | Memory management method and apparatus | |
CN107015866B (zh) | 一种数据处理方法及装置 | |
CN106874077B (zh) | 进程运行方法及装置 | |
WO2015014185A1 (en) | Method, device and system for detecting malware in mobile terminal | |
CN104077184B (zh) | 一种应用程序的进程控制方法及计算机系统 | |
CN104965722B (zh) | 一种显示信息的方法及装置 | |
US20170097725A1 (en) | Device and method for starting mobile terminal application and mobile terminal | |
WO2015078264A1 (zh) | 安全防护方法及装置、终端 | |
CN104572046A (zh) | 一种堆栈还原方法和计算机系统 | |
CN103197944B (zh) | 一种应用程序的进程的性能确定方法和计算机系统 | |
CN110046497B (zh) | 一种函数挂钩实现方法、装置和存储介质 | |
CN106326073A (zh) | 信息处理的方法及移动终端 | |
CN111273955A (zh) | 热修复插件优化方法、装置、存储介质及电子设备 | |
EP3129883B1 (en) | Method and apparatus for repairing dynamic link library file | |
CN105278942B (zh) | 组件管理方法及装置 | |
CN107818036B (zh) | 黑屏检测方法、移动终端及计算机可读存储介质 | |
CN106919458B (zh) | Hook目标内核函数的方法及装置 | |
CN109145598B (zh) | 脚本文件的病毒检测方法、装置、终端及存储介质 | |
CN107122204B (zh) | 应用的卸载状态检测方法及装置 | |
CN107918583B (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 |