CN110442404A - 一种对象释放方法、装置、设备和存储介质 - Google Patents
一种对象释放方法、装置、设备和存储介质 Download PDFInfo
- Publication number
- CN110442404A CN110442404A CN201910745093.3A CN201910745093A CN110442404A CN 110442404 A CN110442404 A CN 110442404A CN 201910745093 A CN201910745093 A CN 201910745093A CN 110442404 A CN110442404 A CN 110442404A
- Authority
- CN
- China
- Prior art keywords
- component
- instance objects
- data
- class
- internal layer
- 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
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- 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/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例公开了一种对象释放方法、装置、设备和存储介质,该方法包括:将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处;当检测到组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。通过本发明实施例的技术方案,可以实现实例对象的及时释放,有效避免出现内存泄漏的问题,保证应用程序的正常运行。
Description
技术领域
本发明实施例涉及计算机技术,尤其涉及一种对象释放方法、装置、设备和存储介质。
背景技术
随着计算机技术的快速发展,各种应用程序APP(Application)被研发应用在终端设备中,以满足用户日益增长的需求。在每个应用程序中往往需要创建各种组件以及组件中的实例对象来实现应用程序的页面展示、交互、下载、状态查询等功能。
现有技术中,基于Android系统开发的应用程序中通常是直接利用new关键字进行实例化操作,创建出组件中所需的实例对象,并且当组件中的每个函数需要使用实例对象时均会进行创建,从而会存在大量的实例对象。然而,现有技术中并不存在对创建的实例对象进行释放的管理操作,使得系统无法自动回收分配给实例对象的内存,从而在实例对象过多时会导致大量内存泄漏的问题,进而影响应用程序的正常运行。
发明内容
本发明实施例提供了一种对象释放方法、装置、设备和存储介质,以实现实例对象的及时释放,有效避免出现内存泄漏的问题,保证应用程序的正常运行。
第一方面,本发明实施例提供了一种对象释放方法,包括:
将组件的组件标识与所述组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定所述类对象对应的实例对象,并将所述实例对象与所述实例对象的对象标识存储至数据缓存对象中所述组件标识对应的目标位置处;
当检测到所述组件的组件销毁操作时,将所述组件标识作为函数输入参数,调用所述数据管理对象中的数据释放函数,将所述数据缓存对象中存储的所述组件标识、所述组件标识对应的所述实例对象以及所述实例对象的对象标识进行释放。
第二方面,本发明实施例还提供了一种对象释放装置,包括:
数据导航模块,用于将组件的组件标识与所述组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定所述类对象对应的实例对象,并将所述实例对象与所述实例对象的对象标识存储至数据缓存对象中所述组件标识对应的目标位置处;
对象释放模块,用于当检测到所述组件的组件销毁操作时,将所述组件标识作为函数输入参数,调用所述数据管理对象中的数据释放函数,将所述数据缓存对象中存储的所述组件标识、所述组件标识对应的所述实例对象以及所述实例对象的对象标识进行释放。
第三方面,本发明实施例还提供了一种设备,所述设备包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如本发明任意实施例所提供的对象释放方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如本发明任意实施例所提供的对象释放方法。
本发明实施例通过预先创建一个数据管理对象和一个数据缓存对象,从而可以利用数据管理对象中的数据导航函数和数据释放函数对实例对象进行有效管理,并利用数据缓存对象来存储组件标识、对象标识和实例对象。当组件需要使用实例对象时,将该组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处,从而获得实例对象并进行数据存储。当检测到该组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,可以将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放,从而将组件的销毁与实例对象的释放进行绑定,自动实现了实例对象的及时释放,有效避免了出现内存泄漏的问题,保证了应用程序的正常运行。
附图说明
图1是本发明实施例一提供的一种对象释放方法的流程图;
图2是本发明实施例二提供的一种对象释放方法的流程图;
图3是本发明实施例三提供的一种对象释放装置的结构示意图;
图4是本发明实施例四提供的一种设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1为本发明实施例一提供的一种对象释放方法的流程图,本实施例可适用于对组件中创建的实例对象进行释放的情况。该方法可以由对象释放装置来执行,该装置可以由软件和/或硬件的方式来实现,集成于搭载有Android系统的设备中,比如智能手机、平板电脑、智能电视或者笔记本电脑等智能终端。该方法具体包括以下步骤:
S110、将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处。
其中,组件可以是指应用程序中所需要使用的任意控件,例如提供用户界面接口功能的可视化组件,如活动窗口组件Activity、按钮、视图组件等。组件标识可以是用于区分不同组件的标识。本实施例可以利用但不限于哈希码来唯一表征组件标识。类对象可以是指当前组件中需要进行实例化的一个Class对象。数据管理对象可以是预先创建的,用于对组件中的对象创建、存储和释放进行管理的对象。实例对象可以是指对类对象进行实例化后获得的对象。对象标识可以用于区分不同实例对象的标识。本实施例可以将实例对象对应的全路径信息作为对象标识,以便保证对象标识的唯一性。其中,全路径信息可以是指实例对象所对应的包名和类名。数据缓存对象可以是预先创建的,用于存储每个组件所对应的组件标识、以及每个组件中已创建出的实例对象和相应的对象标识。目标位置可以是指数据缓存对象中用于存储该组件标识所对应的已创建出的实例对象和对象标识的空间位置。
其中,数据导航函数可以是指数据管理对象中预先定义的,用于管理实例对象的创建和数据存储的函数。示例性地,数据导航函数可以定义为:
@Synchronized
fun<T>navgation(id:Int,clazz:Class<T>):T?{}
其中,数据导航函数的函数名称为:navgation。数据导航函数可以定义为一个泛型函数,即不固定类型的函数,以扩大该函数的适用范围。具体地可以通过fun<T>将数据导航函数的泛型设置为T类型。数据导航函数可以具有两个输入参数和一个输出参数,其中第一输入参数为整型int类型的组件标识id;第二输入参数为泛型类型Class<T>的类对象clazz,即一个T类型的Class对象;输出参数为泛型类型T的实例对象。示例性地,数据导航函数可以是预先标记有同步标签@Synchronized的同步函数,以避免因多线程同时调用数据导航函数进行数据管理而出现的异常问题,实现了数据导航函数的串行调用,从而可以有效地统一管理数据。
其中,数据缓存对象可以利用键值对MAP的数据结构进行数据存储和管理,以提高管理效率。示例性地,数据缓存对象的数据结构可以为两层嵌套式的键值对MAP结构,即外层键值对和内层键值对。其中,外层键值对中的键位置用于存储整型类型的组件标识;外层键值对中的值位置用于存储内层集合对象;内层集合对象用于存储至少一个内层键值对的信息;每个内层键值对中的键位置用于存储字符串类型的实例对象的对象标识;内层键值对中的值位置用于存储任意类型的实例对象。示例性地,数据缓存对象可以定义为:
private var cacheMap:MutableMap<Int,MutableMap<String,Any>>=HashMap()
其中,数据缓存对象cacheMap可以是一个全局的具有私有权限修饰符private的对象,以便保证数据的私密性。数据缓存对象的数据结构可以为基于哈希表Hash的键值对Map结构,即HashMap()结构,以提高数据管理效率。数据缓存对象的具体HashMap()数据结构为:MutableMap<Int,MutableMap<String,Any>>,其中,外层键值对中的键位置用于存储整型Int类型的组件标识;外层键值对中的值位置用于存储内层集合对象,该内层集合对象的数据结构为MutableMap<String,Any>,用于存储每个内层键值对的信息<String,Any>,其中,内层键值对中的键位置用于存储字符串String类型的实例对象的对象标识;内层键值对中的值位置用于存储任意Any类型的实例对象。
具体地,当某个组件需要使用某个实例对象时,可以通过将该组件的组件标识与组件中的该实例对象所对应的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,获得类对象对应的实例对象,以使该组件基于获得的实例对象进行后续的组件操作,并且在数据缓存对象中未存储有该实例对象时,可以将该实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处,比如存储至数据缓存对象中组件标识id所对应的内层集合对象中,从而可以将组件中已创建出的实例对象实时存储至同一位置处,以便后续的释放操作。
S120、当检测到组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。
其中,组件销毁操作可以是对创建出的组件进行删除的操作。每个组件对应的组件销毁操作不同。例如,一个按钮对应的组件销毁操作可以是按钮的点击操作;一个活动窗口组件的组件销毁操作可以是指调用活动窗口组件的销毁函数onDestory()的操作。数据释放函数可以是指预先定义的,用于释放组件中已创建的实例对象和其数据的函数。示例性地,数据释放函数可以定义为:
fun release(id:Int){}
其中,数据释放函数的函数名称为release,其具有一个输入参数,即整型int类型的组件标识id。
具体地,本实施例可以实时检测应用程序中是否存在组件销毁操作。例如,在应用程序启动时,调用Application对象的生命周期注册函数,并可以在生命周期注册函数中复写监听器中的活动窗口组件的销毁函数onDestory(),以便可以实时监听活动窗口组件的销毁函数是否被调用。当监听到当前活动窗口组件的销毁函数被调用时,表明检测到活动窗口组件的组件销毁操作。若检测到组件销毁操作,则表明该组件即将被删除,后续不会再使用为该组件所创建出的实例对象,使得这些实例对象为无用数据,此时可以通过调用数据管理对象中的数据释放函数,获取数据缓存对象中存储的组件标识对应的实例对象以及实例对象的对象标识,并将获得的实例对象和对象标识以及组件标识进行整体删除,从而可以将组件的销毁与实例对象的释放进行绑定,以便在销毁组件时,自动实现实例对象的及时释放,有效避免了出现内存泄漏的问题,保证了应用程序的正常运行。
本实施例的技术方案,通过预先创建一个数据管理对象和一个数据缓存对象,从而可以利用数据管理对象中的数据导航函数和数据释放函数对实例对象进行有效管理,并利用数据缓存对象来存储组件标识、对象标识和实例对象。当组件需要使用实例对象时,将该组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处,从而获得实例对象并进行数据存储。当检测到该组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,可以将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放,从而将组件的销毁与实例对象的释放进行绑定,自动实现实例对象的及时释放,进而自动回收分配给实例对象的内存,有效避免了出现内存泄漏的问题,保证了应用程序的正常运行。
在上述技术方案的基础上,在S110之前,还可以包括:通过调用延迟函数,将实例化模式设置为同步模式,并对预设的数据管理类进行实例化获得数据管理对象,其中,数据管理对象是一个处于静态域中的全局对象。
其中,延迟函数可以是指系统提供的用于将类延迟初始化的函数。示例性地,延迟函数可以为系统提供的Lazy函数。
具体地,本实施例可以预先定义一个用于对实例对象创建、存储和释放进行管理的数据管理类:class DJLoader,然后在该数据管理类的静态域中定义一个全局变量instance。具体为:在companion object{}的作用域中定义一个DJLoader类型的全局变量instance,即val instance:DJLoader,并将全局变量instance的实现委托到系统提供的延迟函数中,以便在需要进行对象管理时再创建出数据管理对象。本实施例为了避免因多线程同时访问数据管理对象而出现并发异常的情况,可以在延迟函数内部,通过mode=LazyThreadSafetyMode.SYNCHRONIZED的方式,将可选的实例化模式设置为同步模式,其中,LazyThreadSafetyMode.SYNCHRONIZED表示初始化线程安全模式LazyThreadSafetyMode中的同步模式SYNCHRONIZED,也就是在初始化属性时进行双重锁检测,从而保证只在一个线程中计算数值,并且所有线程均会获得相同的数值。将数据管理类实例化后的对象返回给全局变量instance,从而可以获得一个处于静态域中的全局对象,即数据管理对象。通过将数据管理对象存放在内存的静态区中,使得全局只有一份,从而可以便于其他类来获取全局唯一的数据管理对象,提高开发的便捷性和可维护性。
在上述技术方案的基础上,数据释放函数可以通过如下步骤实现将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放的功能:
获取数据缓存对象中缓存的组件对应的实例对象数量;在实例对象数量小于或等于预设阈值时,一次性清除数据缓存对象中组件标识对应的内层集合对象中的数据,并将内层集合对象进行置空处理,以及清除数据缓存对象中的组件标识;在实例对象数量大于预设阈值时,定时分批清除数据缓存对象中组件标识对应的内层集合对象中的数据,当内层集合对象中的数据清除完成时,将内层集合对象进行置空处理,并清除数据缓存对象中的组件标识。
具体地,本实施例可以基于数据存储对象中缓存的实例对象数量,确定出释放方式是一次性释放还是定时分批释放,以便利用适宜的释放方式来清除数据,提高释放效率以及保证系统中其他程序的正常运行。本实施例可以从数据缓存对象cacheMap中获取组件标识id所对应的内层集合对象idCache,即idCache=cacheMap(id),从而可以读取内层集合对象idCache的大小,获得该组件中已创建的实例对象数量。在实例对象数量小于或等于预设阈值时,表明缓存的数据量较少,释放对象所需要的CPU(Central Processing Unit,中央处理器)开销较低,此时可以进行一次性地清除数据,即可以通过调用数据清除函数idCache?.clear(),将idCache中存储的所有实例对象以及对象标识进行删除,并可以利用可空操作符?来保证在idCache为非空对象时再进行清除操作,在idCache为空对象时无需进行清除操作,以提高程序的稳定性。并且在对内层集合对象中的数据清除后,可以通过idCachez=null的方式将内层集合对象进行置空处理,以避免进行依附,从而可以回收内存。然后通过调用标识清除函数cacheMap.remove(id),清除数据缓存对象cacheMap中的组件标识,从而可以将数据缓存对象中缓存的该组件的所有数据均进行释放。
在实例对象数量大于预设阈值时,表明缓存的数据量较多,释放对象所需要CPU开销较高,此时若直接一次性地清除数据,则占用CPU资源较多,在释放对象过程中无法支撑其它组件的正常运行,从而需要定时分批地清除数据,以降低每次释放对象的CPU开销。具体地,可以通过周期性的定时器来实现定时分批清除的操作。当到达定时时间时,可以清除内层集合对象idCache中预设数量的实例对象,其中预设数量小于预设阈值。当内层集合对象中的数据清除完成时,停止定时器,并通过上述相同的方式,将内层集合对象进行置空处理,以及清除数据缓存对象中的组件标识,从而在释放对象的过程中可以保证其它组件的正常运行,进一步保证了应用程序的正常运行。
实施例二
图2为本发明实施例二提供的一种对象释放方法的流程图,本实施例在上述实施例的基础上,对数据导航函数的内部操作进行了详细描述。其中与上述实施例相同或相应的术语的解释在此不再赘述。
参见图2,本实施例提供的对象释放方法具体包括以下步骤:
其中,数据导航函数可以通过如下步骤S210-S260,实现确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处的功能。
S210、通过调用数据缓存对象中的内层集合对象获取函数,获得数据缓存对象中组件标识对应的内层集合对象。
其中,内层集合对象获取函数可以是预先定义的,用于获取数据缓存对象中组件标识所对应的内层集合对象的函数。
具体地,本实施例可以通过将组件标识作为函数输入参数,调用内层集合对象获取函数cacheMap(id),将组件标识与数据缓存对象cacheMap的外层键值对中各个键信息进行匹配,将匹配成功的键信息所对应的值信息确定为内层集合对象idCache,从而可以获得组件标识id所对应的内层集合对象idCache。
S220、检测内层集合对象是否为空对象,若是,则进入步骤S230;若否,则进入步骤S240。
具体地,本实施例通过检测内层集合对象是否为空对象,可以确定是否为首次存储组件的实例对象。
S230、对内层集合对象进行依附处理,以使内层集合对象为非空对象,并进入步骤S240。
具体地,当内层集合对象为空对象时,表明还未存储过该组件的实例对象,同时也表明该组件是首次创建实例对象,此时可以对组件标识依附一个空的内层集合对象,分配内存,以便后续存储数据时无需再次申请依附的内层集合对象,提高数据存储效率。本实施例可以通过cacheMap(id)=HashMap()的方式进行依附处理,并在将依附好的数据回填到idCache中,具体是通过调用idCache=cacheMap[id]的方法来将依附好的集合对象回填到内层集合对象idCache中,以保证内层集合对象idCache对象为非空对象。
S240、检测内层集合对象中是否已存储类对象对应的实例对象,若是,则进入步骤S250;若否,则进入步骤S260。
具体地,当内层集合对象为非空对象时,表明该组件标识已经存在依附好的内层集合对象,此时可以直接利用该内层集合对象来存储数据。本实施例可以通过检测内层集合对象中是否存在实例对象所对应的对象标识,若是,则表明内层集合对象中已存储有类对象对应的实例对象,此时执行步骤S250的操作;若否,则表明内层集合对象中未存储有类对象对应的实例对象,此时执行步骤S260的操作。
示例性地,在实例对象对应的对象标识为类对象的全路径信息时,可以通过检测内层集合对象idCache是否存储有该类对象clazz的全路径信息canonicalName,来确定是否存储有该实例对象。例如,可以通过调用var obj=idCache?.get(clazz.canonicalName!!),然后在obj对象为一个空对象时,表明内层集合对象中未存储类对象对应的实例对象,在obj对象为一个非空对象时,即obj对象存储的是类对象的全路径信息,表明内层集合对象中已存储有类对象对应的实例对象。通过利用“?”操作符,可以在保证idCache为非空对象时再执行后续的get函数,从而保证数据的安全性。并通过使用clazz.canonicalName!!方式来强制获取类对象的全路径信息,其中!!表示全路径信息不可能为空,如果为空返回异常消息以向系统发出警告,否则可以获得类对象的全路径信息。
S250、从内层集合对象中获取类对象对应的实例对象,并输出实例对象,并进入步骤S270。
具体地,当检测到内层集合对象中已存储类对象对应的实例对象时,表明该组件需要使用的实例对象已经被创建,此时无需重新创建实例对象,可以将实例对象所对应的对象标识,与内层集合对象中的各个键信息进行匹配,将匹配成功的键信息所对应的值信息确定为类对象的实例对象,并将该实例对象进行输出,以使组件可以使用该实例对象进行组件操作,从而可以避免同一实例对象的重复创建,提高运行效率。需要说明的是,当内层集合对象中已存储类对象对应的实例对象时,无需再对该实例对象进行存储,从而可以有效避免数据的重复存储,提高内存利用率。
S260、根据类对象的全路径信息对类对象进行实例化,创建相应的实例对象,并将创建出的实例对象的对象标识和实例对象存储至内层集合对象中,以及将内层集合对象和组件标识存储至数据缓存对象中,并输出实例对象。
具体地,当检测到内层集合对象未存储类对象对应的实例对象时,表明该组件还未创建过该实例对象,此时可以通过根据类对象的全路径信息,调用Class.forName(clazz.canonicalName!!).newInstance()的方式对类对象进行实例化,创建出相应的实例对象mobj,并将创建出的实例对象mobj逐层回填至内层集合对象中。具体地,可以通过调用idCache?.put(clazz.canonicalName!!,mobj)方法将obj对象回填到内层集合对象idCache中,然后再通过调用cacheMap?.put(id,idCache)方法将内层集合对象idCache回填到数据缓存对象cacheMap中,从而实现了实例对象的实时创建和存储。
示例性地,输出实例对象,可以包括:将获得的实例对象的类型转换为泛型类型,并将转换后的实例对象进行输出。
具体地,在数据导航函数的输出参数为泛型类型的实例对象时,存储的实例对象为一个任意Any类型的对象,从而需要将对象类型从Any类型转换为泛型T类型后再进行输出。示例性地,可以通过调用return mobj as T的方式,将实例对象mobj的类型强制转换为泛型T类型,将转换后的实例对象进行输出,以便可以获得一个T类型的实例对象。
S270、当检测到组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。
本实施例的技术方案,通过实时检测内层集合对象中是否已存储类对象对应的实例对象,并在内层集合对象未存储类对象对应的实例对象时,创建和存储实例对象;在内层集合对象中已存储类对象对应的实例对象时,直接获取实例对象,无需重新创建实例对象,从而可以避免同一实例对象的重复创建和重复存储,提高运行效率以及内存利用率。
以下是本发明实施例提供的对象释放装置的实施例,该装置与上述各实施例的对象释放方法属于同一个发明构思,在对象释放装置的实施例中未详尽描述的细节内容,可以参考上述对象释放方法的实施例。
实施例三
图3为本发明实施例三提供的一种对象释放装置的的结构示意图,本实施例可适用于对组件中创建的实例对象进行释放的情况,该装置具体可以包括:数据导航模块310和对象释放模块320。
其中,数据导航模块310,用于将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处;对象释放模块320,用于当检测到组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。
可选地,该装置还包括:
数据管理对象获取模型,用于在将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数之前,通过调用延迟函数,将实例化模式设置为同步模式,并对预设的数据管理类进行实例化获得数据管理对象,其中,数据管理对象是一个处于静态域中的全局对象。
可选地,数据缓存对象的数据结构为两层嵌套式的键值对MAP结构,其中,外层键值对中的键位置用于存储整型类型的组件标识;外层键值对中的值位置用于存储内层集合对象;内层集合对象用于存储至少一个内层键值对的信息;每个内层键值对中的键位置用于存储字符串类型的实例对象的对象标识;内层键值对中的值位置用于存储任意类型的实例对象。
可选地,数据导航模块310包括数据导航函数执行单元,用于通过如下步骤实现确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处的功能:
通过调用数据缓存对象中的内层集合对象获取函数,获得数据缓存对象中组件标识对应的内层集合对象;
在内层集合对象为空对象时,对内层集合对象进行依附处理,以使内层集合对象为非空对象;
在内层集合对象为非空对象时,检测内层集合对象中是否已存储类对象对应的实例对象;
若是,则从内层集合对象中获取类对象对应的实例对象,并输出实例对象;
若否,则根据类对象的全路径信息对类对象进行实例化,创建相应的实例对象,并将创建出的实例对象的对象标识和实例对象存储至内层集合对象中,以及将内层集合对象和组件标识存储至数据缓存对象中,并输出实例对象。
可选地,数据导航函数具有两个输入参数和一个输出参数,其中第一输入参数为整型类型的组件标识;第二输入参数为泛型类型的类对象;输出参数为泛型类型的实例对象;
相应地,输出实例对象,包括:将获得的实例对象的类型转换为泛型类型,并将转换后的实例对象进行输出。
可选地,对象释放模块320包括数据释放函数执行单元,用于通过如下步骤实现将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放的功能:
获取数据缓存对象中缓存的组件对应的实例对象数量;
在实例对象数量小于或等于预设阈值时,一次性清除数据缓存对象中组件标识对应的内层集合对象中的数据,并将内层集合对象进行置空处理,以及清除数据缓存对象中的组件标识;
在实例对象数量大于预设阈值时,定时分批清除数据缓存对象中组件标识对应的内层集合对象中的数据,当内层集合对象中的数据清除完成时,将内层集合对象进行置空处理,并清除数据缓存对象中的组件标识。
可选地,数据缓存对象具有私有权限修饰符;数据导航函数是预先标记有同步标签的同步函数。
本发明实施例所提供的对象释放装置可执行本发明任意实施例所提供的对象释放方法,具备执行对象释放方法相应的功能模块和有益效果。
实施例四
图4是本发明实施例四提供的一种设备的结构示意图。参见图4,该设备包括:
一个或多个处理器410;
存储器420,用于存储一个或多个程序;
当一个或多个程序被一个或多个处理器410执行,使得一个或多个处理器410实现如上述任意实施例所提供的对象释放方法,该方法包括:
将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处;
当检测到组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。
图4中以一个处理器410为例;设备中的处理器410和存储器420可以通过总线或其他方式连接,图4中以通过总线连接为例。
存储器420作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的对象释放方法对应的程序指令/模块(例如,对象释放装置中的数据导航模块310和对象释放模块320)。处理器410通过运行存储在存储器420中的软件程序、指令以及模块,从而执行设备的各种功能应用以及数据处理,即实现上述的对象释放方法。
存储器420主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据设备的使用所创建的数据等。此外,存储器420可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器420可进一步包括相对于处理器410远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
本实施例提出的设备与上述实施例提出的对象释放方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见上述实施例,并且本实施例具备执行对象释放方法相同的有益效果。
实施例五
本实施例五提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所提供的对象释放方法,该方法包括:
将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处;
当检测到组件的组件销毁操作时,将组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
本领域普通技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个计算装置上,或者分布在多个计算装置所组成的网络上,可选地,他们可以用计算机装置可执行的程序代码来实现,从而可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件的结合。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (10)
1.一种对象释放方法,其特征在于,包括:
将组件的组件标识与所述组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定所述类对象对应的实例对象,并将所述实例对象与所述实例对象的对象标识存储至数据缓存对象中所述组件标识对应的目标位置处;
当检测到所述组件的组件销毁操作时,将所述组件标识作为函数输入参数,调用所述数据管理对象中的数据释放函数,将所述数据缓存对象中存储的所述组件标识、所述组件标识对应的所述实例对象以及所述实例对象的对象标识进行释放。
2.根据权利要求1所述的方法,其特征在于,在将组件的组件标识与所述组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数之前,还包括:
通过调用延迟函数,将实例化模式设置为同步模式,并对预设的数据管理类进行实例化获得数据管理对象,其中,所述数据管理对象是一个处于静态域中的全局对象。
3.根据权利要求1所述的方法,其特征在于,所述数据缓存对象的数据结构为两层嵌套式的键值对MAP结构,其中,外层键值对中的键位置用于存储整型类型的组件标识;所述外层键值对中的值位置用于存储内层集合对象;所述内层集合对象用于存储至少一个内层键值对的信息;每个内层键值对中的键位置用于存储字符串类型的实例对象的对象标识;所述内层键值对中的值位置用于存储任意类型的实例对象。
4.根据权利要求3所述的方法,其特征在于,所述数据导航函数通过如下步骤实现确定所述类对象对应的实例对象,并将所述实例对象与所述实例对象的对象标识存储至数据缓存对象中所述组件标识对应的目标位置处的功能:
通过调用数据缓存对象中的内层集合对象获取函数,获得所述数据缓存对象中所述组件标识对应的内层集合对象;
在所述内层集合对象为空对象时,对所述内层集合对象进行依附处理,以使所述内层集合对象为非空对象;
在所述内层集合对象为非空对象时,检测所述内层集合对象中是否已存储所述类对象对应的实例对象;
若是,则从内层集合对象中获取所述类对象对应的实例对象,并输出所述实例对象;
若否,则根据所述类对象的全路径信息对所述类对象进行实例化,创建相应的实例对象,并将创建出的实例对象的对象标识和所述实例对象存储至所述内层集合对象中,以及将所述内层集合对象和所述组件标识存储至所述数据缓存对象中,并输出所述实例对象。
5.根据权利要求4所述的方法,其特征在于,所述数据导航函数具有两个输入参数和一个输出参数,其中第一输入参数为整型类型的组件标识;第二输入参数为泛型类型的类对象;输出参数为泛型类型的实例对象;
相应地,输出所述实例对象,包括:
将获得的实例对象的类型转换为所述泛型类型,并将转换后的实例对象进行输出。
6.根据权利要求1所述的方法,其特征在于,所述数据释放函数通过如下步骤实现将所述数据缓存对象中存储的所述组件标识、所述组件标识对应的所述实例对象以及所述实例对象的对象标识进行释放的功能:
获取所述数据缓存对象中缓存的所述组件对应的实例对象数量;
在所述实例对象数量小于或等于预设阈值时,一次性清除所述数据缓存对象中所述组件标识对应的内层集合对象中的数据,并将所述内层集合对象进行置空处理,以及清除所述数据缓存对象中的所述组件标识;
在所述实例对象数量大于预设阈值时,定时分批清除所述数据缓存对象中所述组件标识对应的内层集合对象中的数据,当所述内层集合对象中的数据清除完成时,将所述内层集合对象进行置空处理,并清除所述数据缓存对象中的所述组件标识。
7.根据权利要求1-6任一所述的方法,其特征在于,所述数据缓存对象具有私有权限修饰符;所述数据导航函数是预先标记有同步标签的同步函数。
8.一种对象释放装置,其特征在于,包括:
数据导航模块,用于将组件的组件标识与所述组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定所述类对象对应的实例对象,并将所述实例对象与所述实例对象的对象标识存储至数据缓存对象中所述组件标识对应的目标位置处;
对象释放模块,用于当检测到所述组件的组件销毁操作时,将所述组件标识作为函数输入参数,调用所述数据管理对象中的数据释放函数,将所述数据缓存对象中存储的所述组件标识、所述组件标识对应的所述实例对象以及所述实例对象的对象标识进行释放。
9.一种设备,其特征在于,所述设备包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-7中任一所述的对象释放方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-7中任一所述的对象释放方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910745093.3A CN110442404B (zh) | 2019-08-13 | 2019-08-13 | 一种对象释放方法、装置、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910745093.3A CN110442404B (zh) | 2019-08-13 | 2019-08-13 | 一种对象释放方法、装置、设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110442404A true CN110442404A (zh) | 2019-11-12 |
CN110442404B CN110442404B (zh) | 2022-07-05 |
Family
ID=68434993
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910745093.3A Active CN110442404B (zh) | 2019-08-13 | 2019-08-13 | 一种对象释放方法、装置、设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110442404B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114510334A (zh) * | 2022-02-16 | 2022-05-17 | 阿波罗智能技术(北京)有限公司 | 类实例的调用方法、装置、电子设备及自动驾驶车辆 |
Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101178669A (zh) * | 2007-12-13 | 2008-05-14 | 华为技术有限公司 | 资源回收方法及装置 |
US20080209404A1 (en) * | 2007-02-27 | 2008-08-28 | International Business Machines Corporation | Method and system for analyzing memory leaks occurring in java virtual machine data storage heaps |
CN102946486A (zh) * | 2012-11-20 | 2013-02-27 | 惠州Tcl移动通信有限公司 | 一种基于手机的后台应用自动清理方法及手机 |
WO2015085732A1 (zh) * | 2013-12-10 | 2015-06-18 | 中兴通讯股份有限公司 | 终端内存处理方法、装置及终端 |
JP2015201050A (ja) * | 2014-04-08 | 2015-11-12 | 富士通株式会社 | キャッシュ保存プログラム、情報処理装置およびキャッシュ保存方法 |
CN106528444A (zh) * | 2016-12-05 | 2017-03-22 | 北京金和网络股份有限公司 | 内存缓存对象自动管理方法 |
CN106990914A (zh) * | 2017-02-17 | 2017-07-28 | 深圳市中博睿存信息技术有限公司 | 数据删除方法及装置 |
CN109144477A (zh) * | 2018-07-06 | 2019-01-04 | 武汉斗鱼网络科技有限公司 | 一种自动管理类对象内存的方法及电子设备 |
CN109254858A (zh) * | 2018-08-31 | 2019-01-22 | 武汉斗鱼网络科技有限公司 | 活动窗口的数据共享方法、装置、设备及存储介质 |
CN109271355A (zh) * | 2018-08-27 | 2019-01-25 | 杭州迪普科技股份有限公司 | 一种清理日志文件缓存的方法及装置 |
US10210167B1 (en) * | 2012-05-07 | 2019-02-19 | Amazon Technologies, Inc. | Multi-level page caching for distributed object store |
CN109413507A (zh) * | 2018-09-30 | 2019-03-01 | 武汉斗鱼网络科技有限公司 | 弹幕库与直播间引用关系的处理方法、装置、终端和介质 |
CN109413498A (zh) * | 2018-10-19 | 2019-03-01 | 武汉斗鱼网络科技有限公司 | 一种弹幕消息的分发方法、装置、终端和存储介质 |
CN109558308A (zh) * | 2018-09-29 | 2019-04-02 | 中国平安人寿保险股份有限公司 | 应用程序内存泄露检测方法、装置、电子设备及存储介质 |
CN110032529A (zh) * | 2018-01-11 | 2019-07-19 | 武汉斗鱼网络科技有限公司 | 一种内存管理方法及相关装置 |
-
2019
- 2019-08-13 CN CN201910745093.3A patent/CN110442404B/zh active Active
Patent Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080209404A1 (en) * | 2007-02-27 | 2008-08-28 | International Business Machines Corporation | Method and system for analyzing memory leaks occurring in java virtual machine data storage heaps |
CN101178669A (zh) * | 2007-12-13 | 2008-05-14 | 华为技术有限公司 | 资源回收方法及装置 |
US10210167B1 (en) * | 2012-05-07 | 2019-02-19 | Amazon Technologies, Inc. | Multi-level page caching for distributed object store |
CN102946486A (zh) * | 2012-11-20 | 2013-02-27 | 惠州Tcl移动通信有限公司 | 一种基于手机的后台应用自动清理方法及手机 |
WO2015085732A1 (zh) * | 2013-12-10 | 2015-06-18 | 中兴通讯股份有限公司 | 终端内存处理方法、装置及终端 |
JP2015201050A (ja) * | 2014-04-08 | 2015-11-12 | 富士通株式会社 | キャッシュ保存プログラム、情報処理装置およびキャッシュ保存方法 |
CN106528444A (zh) * | 2016-12-05 | 2017-03-22 | 北京金和网络股份有限公司 | 内存缓存对象自动管理方法 |
CN106990914A (zh) * | 2017-02-17 | 2017-07-28 | 深圳市中博睿存信息技术有限公司 | 数据删除方法及装置 |
CN110032529A (zh) * | 2018-01-11 | 2019-07-19 | 武汉斗鱼网络科技有限公司 | 一种内存管理方法及相关装置 |
CN109144477A (zh) * | 2018-07-06 | 2019-01-04 | 武汉斗鱼网络科技有限公司 | 一种自动管理类对象内存的方法及电子设备 |
CN109271355A (zh) * | 2018-08-27 | 2019-01-25 | 杭州迪普科技股份有限公司 | 一种清理日志文件缓存的方法及装置 |
CN109254858A (zh) * | 2018-08-31 | 2019-01-22 | 武汉斗鱼网络科技有限公司 | 活动窗口的数据共享方法、装置、设备及存储介质 |
CN109558308A (zh) * | 2018-09-29 | 2019-04-02 | 中国平安人寿保险股份有限公司 | 应用程序内存泄露检测方法、装置、电子设备及存储介质 |
CN109413507A (zh) * | 2018-09-30 | 2019-03-01 | 武汉斗鱼网络科技有限公司 | 弹幕库与直播间引用关系的处理方法、装置、终端和介质 |
CN109413498A (zh) * | 2018-10-19 | 2019-03-01 | 武汉斗鱼网络科技有限公司 | 一种弹幕消息的分发方法、装置、终端和存储介质 |
Non-Patent Citations (3)
Title |
---|
张玲等: "一种基于Qt的系统内存泄漏检测方法", 《计算机技术与发展》 * |
陆登等: "基于对象数据库的扩展Java集合框架", 《计算机应用与软件》 * |
雷文平等: "基于C++的对象关系映射架构", 《计算机工程》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114510334A (zh) * | 2022-02-16 | 2022-05-17 | 阿波罗智能技术(北京)有限公司 | 类实例的调用方法、装置、电子设备及自动驾驶车辆 |
Also Published As
Publication number | Publication date |
---|---|
CN110442404B (zh) | 2022-07-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109918141B (zh) | 线程执行方法、装置、终端及存储介质 | |
EA003407B1 (ru) | Способ исключающего взаимоблокировку конфигурирования потоковых процессоров и микросхем с двух- или многомерной структурой расположения программируемых ячеек (ппвм, дпвм и т.п.) | |
CN105184166A (zh) | 基于内核的安卓程序实时行为分析方法及系统 | |
WO2016112625A1 (zh) | 一种在预设嵌入式系统中实现脚本操作的系统 | |
FR2816730A1 (fr) | Procede de securisation rendant deterministe l'execution en temps reel d'applications multitaches du type controle- commande avec confinement d'erreur | |
CN103294558B (zh) | 一种支持动态信任评估的MapReduce调度方法 | |
CN108399331A (zh) | 应用进程试用方法和系统 | |
CN106843977B (zh) | 一种应用程序自启动的处理方法、装置及移动终端 | |
CN109144534A (zh) | 服务模块动态更新方法、装置及电子设备 | |
CN110457132B (zh) | 一种功能对象的创建方法、装置和终端设备 | |
JP2021530756A (ja) | ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 | |
CN110162344A (zh) | 一种隔离限流的方法、装置、计算机设备及可读存储介质 | |
CN106874086A (zh) | 一种应用程序自启动的处理方法、装置及移动终端 | |
CN107391539B (zh) | 事务处理方法、服务器和存储介质 | |
CN106874048B (zh) | 一种应用程序自启动的处理方法、装置及移动终端 | |
CN110442404A (zh) | 一种对象释放方法、装置、设备和存储介质 | |
CN107368498A (zh) | 优化MySQL悲观锁的锁等待超时时间的方法及装置 | |
CN113127775B (zh) | 一种页面加载方法、装置、设备和存储介质 | |
CN109753321B (zh) | 基于协议注册的应用启动方法、装置、终端和存储介质 | |
CN106648898A (zh) | 一种适用于多生产者多消费者模式的数据管理方法及系统 | |
CN106874088B (zh) | 一种应用程序自启动的处理方法、装置及移动终端 | |
CN106911730A (zh) | 一种云盘服务器访问迁移方法和装置 | |
CN113326172B (zh) | 一种运维知识的处理方法、装置及设备 | |
CN112506641B (zh) | 一种对象智能释放方法、装置和终端设备 | |
CN106802819A (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 |