首页 / 一种对象智能释放方法、装置和终端设备

一种对象智能释放方法、装置和终端设备有效专利 发明

技术领域

[0001] 本发明实施例涉及计算机技术,尤其涉及一种对象智能释放方法、装置和终端设备。

相关背景技术

[0002] 随着计算机技术的快速发展,各种应用程序APP(Application)被研发应用在终端设备中,以满足用户日益增长的需求。在每个应用程序中往往需要创建各种组件以及组件中的实例对象来实现应用程序的页面展示、交互、下载、状态查询等功能。
[0003] 现有技术中,基于Android系统开发的应用程序中的每个组件运行时均会创建大量的实例对象。每个实例对象的生命周期均是由系统进行统一管理的。系统通常是利用垃圾回收机制来实现对象的释放操作,但需要等到垃圾回收期时才会进行对象的释放操作,从而无法在对象使用结束后及时进行自动释放,降低了内存空间,进而影响了系统的正常运行。

具体实施方式

[0021] 下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
[0022] 实施例一
[0023] 图1为本发明实施例一提供的一种对象智能释放方法的流程图,本实施例可适用于在组件销毁时,对组件中创建的各个实例对象及时进行自动释放,并保证系统的正常运行的情况。该方法可以由对象智能释放装置来执行,该装置可以由软件和/或硬件的方式来实现,集成于搭载有Android系统的设备中,比如智能手机、平板电脑、智能电视或者笔记本电脑等智能终端。该方法具体包括以下步骤:
[0024] S110、当检测到组件的组件销毁操作时,将组件的组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。
[0025] 其中,组件可以是指应用程序中所需要使用的任意控件,例如提供用户界面接口功能的可视化组件,如活动窗口组件Activity、按钮、视图组件等。组件销毁操作可以是对创建出的组件进行删除的操作。每个组件对应的组件销毁操作不同。例如,一个按钮对应的组件销毁操作可以是按钮的点击操作;一个活动窗口组件的组件销毁操作可以是指调用活动窗口组件的销毁函数onDestory()的操作。组件标识可以是指用于区分不同组件的标识。本实施例可以利用但不限于哈希码来唯一表征组件标识。数据管理对象可以是预先创建的,用于对组件中的对象创建、存储和释放进行管理的对象。数据释放函数可以是指预先定义的,用于释放组件中已创建的实例对象和相关数据的函数。示例性地,数据释放函数可以定义为:
[0026] fun release(id:Int){}
[0027] 其中,数据释放函数的函数名称为release,其具有一个输入参数,即整型int类型的组件标识id。
[0028] 其中,实例对象可以是指对类对象进行实例化后获得的对象。类对象可以是指组件中需要进行实例化的一个Class对象。对象标识可以是指用于区分不同实例对象的标识。本实施例可以将实例对象对应的全路径信息作为对象标识,以便保证对象标识的唯一性。
其中,全路径信息可以是指实例对象所对应的包名和类名。
[0029] 其中,数据缓存对象可以是预先创建的,用于存储每个组件所对应的组件标识、以及每个组件中已创建出的实例对象和相应的对象标识。数据缓存对象可以利用键值对MAP的数据结构进行数据存储和管理,以提高管理效率。示例性地,数据缓存对象的数据结构为两层嵌套式的键值对MAP结构,其中,外层键值对中的键位置用于存储整型类型的组件标识;外层键值对中的值位置用于存储内层集合对象;内层集合对象用于存储至少一个内层键值对的信息;每个内层键值对中的键位置用于存储字符串类型的实例对象的对象标识;内层键值对中的值位置用于存储任意类型的实例对象。示例性地,数据缓存对象可以定义为:
[0030] private var cacheMap:MutableMap>=HashMap()
[0031] 其中,数据缓存对象cacheMap可以是一个全局的具有私有权限修饰符private的对象,以便保证数据的私密性。数据缓存对象的数据结构可以为基于哈希表Hash的键值对Map结构,即HashMap()结构,以提高数据管理效率。数据缓存对象的具体HashMap()数据结构为:MutableMap>,其中,外层键值对中的键位置用于存储整型Int类型的组件标识;外层键值对中的值位置用于存储内层集合对象,该内层集合对象的数据结构为MutableMap,用于存储每个内层键值对的信息,其中,内层键值对中的键位置用于存储字符串String类型的实例对象的对象标识;内层键值对中的值位置用于存储任意Any类型的实例对象。
[0032] 具体地,当创建某个组件所需的某个实例对象后,可以将该实例对象与实例对象的对象标识存储至数据缓存对象中该组件的组件标识对应的位置处,比如存储至数据缓存对象中组件标识id所对应的内层集合对象中,从而可以将组件中已创建出的各个实例对象实时存储至同一位置处,以便后续的释放操作。本实施例可以实时检测应用程序中是否存在组件销毁操作。例如,在应用程序启动时,调用Application对象的生命周期注册函数,并可以在生命周期注册函数中复写监听器中的活动窗口组件的销毁函数onDestory(),以便可以实时监听活动窗口组件的销毁函数是否被调用。当监听到活动窗口组件的销毁函数被调用时,表明检测到活动窗口组件的组件销毁操作。在检测到组件销毁操作,则表明该组件即将被删除,后续不会再使用为该组件所创建出的实例对象,使得这些实例对象为无用数据,此时可以通过调用数据管理对象中的数据释放函数,获取数据缓存对象中存储的组件标识对应的实例对象以及实例对象的对象标识,并将获得的实例对象和对象标识以及组件标识进行整体删除,从而可以将组件的销毁与实例对象的释放进行绑定,以便在销毁组件时,同时将创建出的实例对象进行删除,从而实现实例对象的及时自动释放,有效避免了出现内存泄漏的问题,保证了应用程序的正常运行。
[0033] S120、若在释放过程中接收到性能警报消息,则停止对组件标识、组件标识对应的实例对象以及实例对象的对象标识的释放操作,并基于预设定时时间创建定时器,间隔预设定时时间后,继续执行释放操作。
[0034] 其中,性能警报消息可以是指用于警告当前系统因释放操作导致资源开销过大的消息。预设定时时间可以是指基于业务场景和需求预先设置的定时器的定时时间。本实施例中的预设定时时间在释放过程中可以是固定不变的,也可以是动态变化的,以更有效地控制性能消耗。
[0035] 具体地,在利用数据管理对象中的数据释放函数,对组件的组件标识、各个实例对象以及每个实例对象的对象标识进行释放的过程中,可以实时检测是否接收到性能警报消息,以便基于性能警报消息对释放过程进行有效控制,保证在释放过程中其他组件的正常运行,避免系统出现卡顿的情况。当接收到性能警报消息时,表明当前系统因释放操作导致系统资源开销过大,此时可以停止对实例对象的释放操作,以降低性能开销,避免影响其他组件的正常运行,同时创建定时器,使得间隔预设定时时间后,再继续执行该释放操作,从而通过间断性地定时执行自动释放操作,可以避免因释放操作而造成系统出现卡顿的情况,进而提高了系统的运行性能,保证了系统的正常运行。
[0036] 示例性地,在将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放时,还可以包括:获取当前系统的中央处理器CPU使用率;若检测到CPU使用率大于或等于预设使用率阈值时,生成性能警报消息。其中,预设使用率阈值可以是指系统所允许的最大CPU使用率。示例性地,预设使用率阈值可以为70%。
[0037] 具体地,本实施例可以实时监控并获取当前系统运行时所占用的CPU使用率,并将CPU使用率与预设使用率阈值进行比较,当检测到CPU使用率大于或等于预设使用率阈值时,表明当前的释放操作导致的系统性能开销过大,需要通过停止该释放操作的方式降低性能开销,以保证其他组件的正常运行,从而此时可以生成性能警报消息。示例性地,数据管理对象可以预先继承预先设置的警报接口协议,并通过复写预设警报接口协议中的警报函数,以通过该警报函数生成性能警报消息,并在生成性能警报消息时,可以通过该预设警报接口协议回调的方式,接收到该性能警报消息。
[0038] 本实施例的技术方案,通过预先创建一个数据缓存对象和一个数据管理对象,从而可以利用数据缓存对象来存储每个组件的组件标识、该组件所创建的实例对象以及每个实例对象的对象标识;利用数据管理对象中的数据释放函数对数据缓存对象中存储的实例对象及时进行自动释放。并在自动释放过程中实时检测是否接收到性能警报消息,若是,则表明当前系统因释放操作而导致系统资源开销过大,此时停止对实例对象的释放操作,以降低性能开销,避免影响其他组件的正常运行,同时基于预设定时时间创建定时器,间隔预设定时时间后,继续执行该释放操作,从而在释放对象的过程中,避免因性能开销过大导致系统出现卡顿的情况,提高了系统的运行性能,并且保证了系统的正常运行。
[0039] 在上述技术方案的基础上,数据释放函数可以通过如下步骤S111-S115实现将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放的功能:
[0040] S111、根据组件的组件标识,从数据缓存对象中确定出组件对应的内层集合对象,并将内层集合对象中的每个实例对象逐个确定为当前实例对象。
[0041] 具体地,本实施例可以通过将组件的组件标识作为函数输入参数,调用内层集合对象获取函数cacheMap(id),将组件标识与数据缓存对象cacheMap的外层键值对中各个键信息进行匹配,将匹配成功的键信息所对应的值信息确定为内层集合对象idCache,从而可以获得组件标识id所对应的内层集合对象idCache。该内层集合对象idCache中存储有该组件已创建的各个实例对象以及每个实例对象对应的对象标识。本实施例可以基于内层集合对象中存储的各个实例对象的存储顺序,依次将内层集合对象中的每个实例对象逐个作为当前实例对象,以对各个实例对象进行周期性循环释放,并且每个周期释放一个实例对象。例如,在第一个释放周期内,可以将内层集合对象中的第一个实例对象作为当前实例对象。
[0042] 示例性地,本实施例可以调用内层集合对象中的循环函数forEach,获取内层集合对象中的每个元素信息,即:
[0043]
[0044] 通过上述循环函数,可以将内层集合对象中的每个元素信息中的实例对象赋值给变量obj,即作为当前实例对象,以及实例对象的对象标识赋值给变量key。
[0045] 示例性地,将内层集合对象中的每个实例对象逐个确定为当前实例对象,可以包括:获取内层集合对象中的每个实例对象的使用频率,并基于各使用频率对各实例对象进行升序排列;将排列后的各个实例对象逐个确定为当前实例对象。其中,使用频率可以是指预设时间内组件使用实例对象的次数。
[0046] 具体地,本实施例可以基于每个实例对象的使用频率对各个实例对象进行升序排列,以使排列后的各个实例对象的使用频率从小到大依次降低,从而可以基于排列后的次序,依次将每个实例对象确定为当前实例对象,以便可以最先释放使用频率最低的实例对象,最后释放使用频率最高的实例对象,使得释放操作更加合理有效。
[0047] S112、检测当前实例对象的对象类型是否为预设释放接口协议类型,若是,则进入步骤S113;若否,则进入步骤S114。
[0048] 其中,预设释放接口协议可以是预先定义的,用于释放实例对象特有的内部逻辑数据的协议。预设释放接口协议中包含预先定义的逻辑释放函数,以便基于该逻辑释放函数进行内部逻辑数据的释放。预设释放接口协议类型可以是指预先继承有预设释放接口协议的对象类型。
[0049] 示例性地,可以预先定义一个预设释放接口协议,且该预设释放接口协议中包含预先定义的,但未进行函数实现的逻辑释放函数。例如,预设释放接口协议可以定义为:
[0050] Public interfact ISignal{
[0051] Fun onLastClean()
[0052] }
[0053] 其中,预设释放接口协议ISignal具有公有权限修饰符的接口类型,其内部包含一个逻辑释放函数onLastClean,且该逻辑释放函数是一个输入参数为空,返回值也为空的函数。
[0054] 具体地,由于实例对象是任意类型的对象,使得该实例对象所属的类与其他类之间可能存在耦合关系的情况,从而在对实例对象的释放过程中会导致释放失败的情况。针对于此,本实施例可以通过调用obj is ISignal的方式,检测当前实例对象obj的对象类型是否为预设释放接口协议类型ISignal,确定是否可以利用预设释放接口协议中的逻辑释放函数对当前实例对象的内部逻辑数据进行释放,以便避免因存在耦合关系而导致对象释放失败的情况,保证了实例对象的有效释放。
[0055] 需要说明的是,本实施例中的实例对象是任意类型的,即类对象也是成千上万的,有的类对象是通过第三方库接入的,有的类对象是自我设计的,使得类对象实例化后获得的实例对象的对象类型可能是预设释放接口协议类型,也可能不是预设释放接口协议类型,从而需要判断实例对象的对象类型是否为预设释放接口协议类型,以便可以利用不同的释放方式进行释放操作,达到兼容的效果,并且无需实现相应的注册逻辑和反注册逻辑,提高开发的便捷性以及业务逻辑低入侵性。
[0056] 示例性地,在当前实例对象的对象类型为预设释放接口协议类型时,表明当前实例对象所属的当前类对象预先调用接口继承关键字,继承预设释放接口协议,并复写预设释放接口协议中的逻辑释放函数,以使当前类对象中的逻辑释放函数实现当前实例对象的内部逻辑数据的逻辑释放功能。
[0057] 具体地,在当前类对象通过调用接口继承关键字implement的方式,继承预设释放接口协议,并在当前类对象中通过复写@Override的方式来复写预设释放接口协议中的逻辑释放函数onLastClean,通过将当前类对象对应的内部逻辑数据的释放逻辑在当前类对象中的复写函数onLastClean中进行实现,即实例化,使得当前类对象中的逻辑释放函数onLastClean可以实现相应的内部逻辑数据的逻辑释放功能,从而基于该当前类对象所创建出的实例对象可以利用逻辑释放函数进行内部逻辑数据的释放。
[0058] S113、通过调用当前实例对象中的逻辑释放函数,将当前实例对象的内部逻辑数据进行逻辑释放,并将逻辑释放后的当前实例对象进行置空处理,以及将内层集合对象中的当前实例对象的当前对象标识进行删除。
[0059] 具体地,在当前实例对象的对象类型为预设释放接口协议类型时,即当前实例对象内部存在逻辑释放函数,此时可以通过调用当前实例对象中的逻辑释放函数onLastClean,对当前实例对象的内部逻辑进行逻辑释放,即释放当前类对象与其他类对象之间的耦合关系的逻辑,然后将逻辑释放后的当前实例对象通过调用obj=null进行置空处理,并调用idCache.remove(key)方法来将当前实例对象的当前对象标识从内层集合对象中删除,从而实现了内层集合对象中的当前实例对象和当前对象标识的释放。
[0060] S114、将当前实例对象进行置空处理,并将内层集合对象中的当前实例对象的当前对象标识进行删除。
[0061] 具体地,在当前实例对象的对象类型不是预设释放接口协议类型时,表明无法释放对象内部逻辑数据,此时可以通过调用obj=null进行置空处理,并调用idCache.remove(key)方法来将当前实例对象的当前对象标识从内层集合对象中删除,从而当前实例对象无论是否预先继承有预设释放接口协议,都可以及时进行自动释放,提高了释放效率,同时达到了兼容的效果,降低了开发成本。
[0062] S115、在内层集合对象中的每个实例对象均进行释放后,将数据缓存对象中的组件的组件标识进行删除。
[0063] 具体地,内层集合对象中的每个实例对象均作为当前实例对象,利用步骤S112-S114的释放方式进行循环释放。本实施例可以通过调用idCache.size(),获得内层集合对象中的实例对象总数量,并实时统计当前的释放总次数,当释放总次数等于实例对象总数量时,表明内层集合对象中的每个实例对象均进行了释放,此时可以通过调用标识清除函数cacheMap.remove(id),清楚数据缓存对象cacheMap中的组件标识,从而可以将数据缓存对象中缓存的该组件的所有数据均进行自动释放。
[0064] 需要说明的是,在获取内层集合对象中的实例对象总数量时,还可以检测实例对象总数量是否大于预设阈值,若是,则定时分批次地清除内层集合对象中的数据,并在内层集合对象中的数据清除完成时,清除数据缓存对象中的组件标识。示例性地,每个批次所需要清除的实例对象数量可以是动态变化的,其可以与预设定时时间相关联,即预设定时时间越长,则当前批次所需要清除的实例对象数量越少。每个批次之间还可以设置一个定时器,以便释放一批后间隔一段时间再释放另一批,进一步保证系统的运行性能。
[0065] 在上述技术方案的基础上,该方法还可以包括:统计当前接收到的性能警报消息的当前总次数;在检测到当前总次数大于预设次数阈值时,基于预设映射关系确定当前总次数对应的目标定时时间,并将预设定时时间更新为目标定时时间,以间隔目标定时时间后,继续执行释放操作。
[0066] 其中,预设映射关系可以是指性能报警消息次数与定时时间之间的对应关系。示例性地,预设映射关系可以设置为:当性能报警消息次数在nX-(n+1)X之间时,定时时间为(n+1)T,其中X为预设次数阈值;T为预设定时时间的初始值。
[0067] 具体地,可以设置一个全局的预警次数监控变量localPolice,每当接收到性能警报消息时,将localPolice的值进行加1操作,从而可以实时获得当前接收到的性能警报消息的当前总次数。在停止释放操作时,可以检测当前总次数是否大于预设次数阈值,若是,则表明最近一段时间警报触发较为频繁,需要增大定时器的预设定时时间,以便进一步延迟释放操作,降低系统开销,此时可以基于预设映射关系确定出当前总次数所对应的目标定时时间,并将预设定时时间更新为目标定时时间,以间隔目标定时时间后,继续执行释放操作。若当前总次数小于或等于预设次数阈值,则表明警报触发频率较低,此时无需调整预设定时时间,可以继续延迟预设定时时间来保证系统的正常运行。本实施例通过基于警报次数动态调整定时器的定时时间,从而可以更合理地控制系统的性能开销,进一步保证系统的正常运行。
[0068] 实施例二
[0069] 图2为本发明实施例二提供的一种对象智能释放方法的流程图,本实施例在上述实施例的基础上,在对实例对象释放之前,对实例对象的创建操作和存储操作进行了详细描述。其中与上述实施例相同或相应的术语的解释在此不再赘述。
[0070] 参见图2,本实施例提供的一种对象智能释放方法包括以下步骤:
[0071] S210、将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处。
[0072] 其中,数据导航函数可以是指数据管理对象中预先定义的,用于管理实例对象的创建和数据存储的函数。示例性地,数据导航函数可以定义为:
[0073] @Synchronized
[0074] funnavgation(id:Int,clazz:Class):T?{}
[0075] 其中,数据导航函数的函数名称为:navgation。数据导航函数可以定义为一个泛型函数,即不固定类型的函数,以扩大该函数的适用范围。具体地可以通过fun将数据导航函数的泛型设置为T类型。数据导航函数可以具有两个输入参数和一个输出参数,其中第一输入参数为整型int类型的组件标识id;第二输入参数为泛型类型Class的类对象clazz,即一个T类型的Class对象;输出参数为泛型类型T的实例对象。示例性地,数据导航函数可以是预先标记有同步标签@Synchronized的同步函数,以避免因多线程同时调用数据导航函数进行数据管理而出现的异常问题,实现了数据导航函数的串行调用,从而可以有效地统一管理数据。目标位置可以是指数据缓存对象中用于存储该组件标识所对应的已创建出的实例对象和对象标识的空间位置。例如,目标位置可以是指数据缓存对象中组件标识所对应的内层集合对象。
[0076] 具体地,当某个组件需要使用某个实例对象时,可以通过将该组件的组件标识与组件中的该实例对象所对应的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,获得类对象对应的实例对象,以使该组件基于获得的实例对象进行后续的组件操作,并且在数据缓存对象中未存储有该实例对象时,可以将该实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处,比如存储至数据缓存对象中组件标识id所对应的内层集合对象中,从而可以将组件中已创建出的实例对象实时存储至同一位置处,以便后续的释放操作。
[0077] 示例性地,在S210之前还可以包括:通过调用延迟函数,将实例化模式设置为同步模式,并对预设的数据管理类进行实例化获得数据管理对象,其中,数据管理对象是一个处于静态域中的全局对象。
[0078] 其中,延迟函数可以是指系统提供的用于将类延迟初始化的函数。示例性地,延迟函数可以为系统提供的Lazy函数。
[0079] 具体地,本实施例可以预先定义一个用于对实例对象创建、存储和释放进行管理的数据管理类:class DJLoader,然后在该数据管理类的静态域中定义一个全局变量instance。具体为:在companion object{}的作用域中定义一个DJLoader类型的全局变量instance,即val instance:DJLoader,并将全局变量instance的实现委托到系统提供的延迟函数中,以便在需要进行对象管理时再创建出数据管理对象。本实施例为了避免因多线程同时访问数据管理对象而出现并发异常的情况,可以在延迟函数内部,通过mode=LazyThreadSafetyMode.SYNCHRONIZED的方式,将可选的实例化模式设置为同步模式,其中,LazyThreadSafetyMode.SYNCHRONIZED表示初始化线程安全模式LazyThreadSafetyMode中的同步模式SYNCHRONIZED,也就是在初始化属性时进行双重锁检测,从而保证只在一个线程中计算数值,并且所有线程均会获得相同的数值。将数据管理类实例化后的对象返回给全局变量instance,从而可以获得一个处于静态域中的全局对象,即数据管理对象。通过将数据管理对象存放在内存的静态区中,使得全局只有一份,从而可以便于其他类来获取全局唯一的数据管理对象,提高开发的便捷性和可维护性。
[0080] S220、当检测到组件的组件销毁操作时,将组件的组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放。
[0081] S230、若在释放过程中接收到性能警报消息,则停止对组件标识、组件标识对应的实例对象以及实例对象的对象标识的释放操作,并基于预设定时时间创建定时器,间隔预设定时时间后,继续执行释放操作。
[0082] 本实施例的技术方案,通过利用数据管理对象中的数据导航函数对实例对象进行有效管理,当组件需要使用实例对象时,将该组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处,从而自动创建实例对象并进行数据存储。
[0083] 在上述技术方案的基础上,数据导航函数可以通过如下步骤S211-S216,实现确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处的功能。
[0084] S211、通过调用数据缓存对象中的内层集合对象获取函数,获得数据缓存对象中组件标识对应的内层集合对象。
[0085] S212、检测内层集合对象是否为空对象,若是,则进入步骤S213;若否,则进入步骤S214。具体地,本实施例通过检测内层集合对象是否为空对象,可以确定是否为首次存储组件的实例对象。
[0086] S213、对内层集合对象进行依附处理,以使内层集合对象为非空对象,并进入步骤S214。
[0087] 具体地,当内层集合对象为空对象时,表明还未存储过该组件的实例对象,同时也表明该组件是首次创建实例对象,此时可以对组件标识依附一个空的内层集合对象,分配内存,以便后续存储数据时无需再次申请依附的内层集合对象,提高数据存储效率。本实施例可以通过cacheMap(id)=HashMap()的方式进行依附处理,并在将依附好的数据回填到idCache中,具体是通过调用idCache=cacheMap[id]的方法来将依附好的集合对象回填到内层集合对象idCache中,以保证内层集合对象idCache对象为非空对象。
[0088] S214、检测内层集合对象中是否已存储类对象对应的实例对象,若是,则进入步骤S215;若否,则进入步骤S216。具体地,当内层集合对象为非空对象时,表明该组件标识已经存在依附好的内层集合对象,此时可以直接利用该内层集合对象来存储数据。本实施例可以通过检测内层集合对象中是否存在实例对象所对应的对象标识,若是,则表明内层集合对象中已存储有类对象对应的实例对象,此时执行步骤S215的操作;若否,则表明内层集合对象中未存储有类对象对应的实例对象,此时执行步骤S216的操作。
[0089] 示例性地,在实例对象对应的对象标识为类对象的全路径信息时,可以通过检测内层集合对象idCache是否存储有该类对象clazz的全路径信息canonicalName,来确定是否存储有该实例对象。例如,可以通过调用var  obj=idCache .get(clazz.canonicalName!!),然后在obj对象为一个空对象时,表明内层集合对象中未存储类对象对应的实例对象,在obj对象为一个非空对象时,即obj对象存储的是类对象的全路径信息,表明内层集合对象中已存储有类对象对应的实例对象。通过使用
clazz.canonicalName!!方式来强制获取类对象的全路径信息,其中!!表示全路径信息不可能为空,如果为空返回异常消息以向系统发出警告,否则可以获得类对象的全路径信息。
[0090] S215、从内层集合对象中获取类对象对应的实例对象,并输出实例对象。
[0091] 具体地,当检测到内层集合对象中已存储类对象对应的实例对象时,表明该组件需要使用的实例对象已经被创建,此时无需重新创建实例对象,可以将实例对象所对应的对象标识,与内层集合对象中的各个键信息进行匹配,将匹配成功的键信息所对应的值信息确定为类对象的实例对象,并将该实例对象进行输出,以使组件可以使用该实例对象进行组件操作,从而可以避免同一实例对象的重复创建,提高运行效率。需要说明的是,当内层集合对象中已存储类对象对应的实例对象时,无需再对该实例对象进行存储,从而可以有效避免数据的重复存储,提高内存利用率。
[0092] S216、根据类对象的全路径信息对类对象进行实例化,创建相应的实例对象,并将创建出的实例对象的对象标识和实例对象存储至内层集合对象中,以及将内层集合对象和组件标识存储至数据缓存对象中,并输出实例对象。
[0093] 具体地,当检测到内层集合对象未存储类对象对应的实例对象时,表明该组件还未创建过该实例对象,此时可以通过根据类对象的全路径信息,调用Class.forName(clazz.canonicalName!!).newInstance()的方式对类对象进行实例化,创建出相应的实例对象mobj,并将创建出的实例对象mobj逐层回填至内层集合对象中。具体地,可以通过调用idCache.put(clazz.canonicalName!!,mobj)方法将obj对象回填到内层集合对象idCache中,然后再通过调用cacheMap.put(id,idCache)方法将内层集合对象idCache回填到数据缓存对象cacheMap中,从而实现了实例对象的实时创建和存储。
[0094] 示例性地,输出实例对象,可以包括:将获得的实例对象的类型转换为泛型类型,并将转换后的实例对象进行输出。
[0095] 具体地,在数据导航函数的输出参数为泛型类型的实例对象时,存储的实例对象为一个任意Any类型的对象,从而需要将对象类型从Any类型转换为泛型T类型后再进行输出。示例性地,可以通过调用return mobj as T的方式,将实例对象mobj的类型强制转换为泛型T类型,将转换后的实例对象进行输出,以便可以获得一个T类型的实例对象。
[0096] 本实施例还可以通过实时检测内层集合对象中是否已存储类对象对应的实例对象,并在内层集合对象未存储类对象对应的实例对象时,创建和存储实例对象;在内层集合对象中已存储类对象对应的实例对象时,直接获取实例对象,无需重新创建实例对象,从而可以避免同一实例对象的重复创建和重复存储,提高运行效率以及内存利用率。
[0097] 以下是本发明实施例提供的对象智能释放装置的实施例,该装置与上述各实施例的对象智能释放方法属于同一个发明构思,在对象智能释放装置的实施例中未详尽描述的细节内容,可以参考上述对象智能释放方法的实施例。
[0098] 实施例三
[0099] 图3为本发明实施例三提供的一种对象智能释放装置的结构示意图,本实施例可适用于在组件销毁时,对组件中创建的各个实例对象及时进行自动释放,并保证系统的正常运行的情况,该装置具体包括:对象释放模块310和释放控制模块320。
[0100] 其中,对象释放模块310,用于当检测到组件的组件销毁操作时,将组件的组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放;释放控制模块320,用于若在释放过程中接收到性能警报消息,则停止对组件标识、组件标识对应的实例对象以及实例对象的对象标识的释放操作,并基于预设定时时间创建定时器,间隔预设定时时间后,继续执行释放操作。
[0101] 可选地,该装置还包括:
[0102] 对象存储模块,用于在当检测到组件的组件销毁操作时,将组件的组件标识作为函数输入参数,调用数据管理对象中的数据释放函数之前,将组件的组件标识与组件中的类class类型的类对象作为函数输入参数,调用数据管理对象中的数据导航函数,确定类对象对应的实例对象,并将实例对象与实例对象的对象标识存储至数据缓存对象中组件标识对应的目标位置处。
[0103] 可选地,数据缓存对象的数据结构为两层嵌套式的键值对MAP结构,其中,外层键值对中的键位置用于存储整型类型的组件标识;外层键值对中的值位置用于存储内层集合对象;内层集合对象用于存储至少一个内层键值对的信息;每个内层键值对中的键位置用于存储字符串类型的实例对象的对象标识;内层键值对中的值位置用于存储任意类型的实例对象。
[0104] 可选地,数据释放函数通过如下单元实现将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放的功能:
[0105] 当前实例对象确定单元,用于根据组件的组件标识,从数据缓存对象中确定出组件对应的内层集合对象,并将内层集合对象中的每个实例对象逐个确定为当前实例对象;
[0106] 对象删除单元,用于若检测到当前实例对象的对象类型为预设释放接口协议类型,则通过调用当前实例对象中的逻辑释放函数,将当前实例对象的内部逻辑数据进行逻辑释放,并将逻辑释放后的当前实例对象进行置空处理,以及将内层集合对象中的当前实例对象的当前对象标识进行删除;
[0107] 组件标识删除单元,用于在将内层集合对象中的每个实例对象均进行释放后,将数据缓存对象中的组件的组件标识进行删除。
[0108] 可选地,该装置还包括:
[0109] 类对象继承协议模块,用于在检测到当前实例对象的对象类型为预设释放接口协议类型之前,当前实例对象所属的当前类对象预先调用接口继承关键字,继承预设释放接口协议,并复写预设释放接口协议中的逻辑释放函数,以使当前类对象中的逻辑释放函数实现当前实例对象的内部逻辑数据的逻辑释放功能。
[0110] 可选地,当前实例对象确定单元,具体用于:
[0111] 获取内层集合对象中的每个实例对象的使用频率,并基于各使用频率对各实例对象进行升序排列;将排列后的各个实例对象逐个确定为当前实例对象。
[0112] 可选地,该装置还包括:
[0113] 性能警报消息生成模块,用于在将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放时,获取当前系统的中央处理器CPU使用率;若检测到CPU使用率大于或等于预设使用率阈值时,生成性能警报消息。
[0114] 可选地,该装置还包括:
[0115] 当前总次数统计模块,用于统计当前接收到的性能警报消息的当前总次数;
[0116] 预设定时时间更新模块,用于在检测到当前总次数大于预设次数阈值时,基于预设映射关系确定当前总次数对应的目标定时时间,并将预设定时时间更新为目标定时时间,以间隔目标定时时间后,继续执行释放操作。
[0117] 本发明实施例所提供的对象智能释放装置可执行本发明任意实施例所提供的对象智能释放方法,具备执行对象智能释放方法相应的功能模块和有益效果。
[0118] 实施例四
[0119] 图4是本发明实施例四提供的一种终端设备的结构示意图。参见图4,该终端设备包括:
[0120] 一个或多个处理器410;
[0121] 存储器420,用于存储一个或多个程序;
[0122] 当一个或多个程序被一个或多个处理器410执行,使得一个或多个处理器410实现如上述实施例中任意实施例所提供的对象智能释放方法,该方法包括:
[0123] 当检测到组件的组件销毁操作时,将组件的组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放;
[0124] 若在释放过程中接收到性能警报消息,则停止对组件标识、组件标识对应的实例对象以及实例对象的对象标识的释放操作,并基于预设定时时间创建定时器,间隔预设定时时间后,继续执行释放操作。
[0125] 图4中以一个处理器410为例;终端设备中的处理器410和存储器420可以通过总线或其他方式连接,图4中以通过总线连接为例。
[0126] 存储器420作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的对象智能释放方法对应的程序指令/模块(例如,对象智能释放装置中的对象释放模块310和释放控制模块320)。处理器410通过运行存储在存储器420中的软件程序、指令以及模块,从而执行终端设备的各种功能应用以及数据处理,即实现上述的对象智能释放方法。
[0127] 存储器420主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端设备的使用所创建的数据等。此外,存储器420可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器420可进一步包括相对于处理器410远程设置的存储器,这些远程存储器可以通过网络连接至终端设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0128] 本实施例提出的终端设备与上述实施例提出的对象智能释放方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见上述实施例,并且本实施例具备执行对象智能释放方法相同的有益效果。
[0129] 实施例五
[0130] 本实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所提供的对象智能释放方法步骤,该方法包括:
[0131] 当检测到组件的组件销毁操作时,将组件的组件标识作为函数输入参数,调用数据管理对象中的数据释放函数,将数据缓存对象中存储的组件标识、组件标识对应的实例对象以及实例对象的对象标识进行释放;
[0132] 若在释放过程中接收到性能警报消息,则停止对组件标识、组件标识对应的实例对象以及实例对象的对象标识的释放操作,并基于预设定时时间创建定时器,间隔预设定时时间后,继续执行释放操作。
[0133] 本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0134] 计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0135] 计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0136] 可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0137] 本领域普通技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个计算装置上,或者分布在多个计算装置所组成的网络上,可选地,他们可以用计算机装置可执行的程序代码来实现,从而可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件的结合。
[0138] 注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页 第1页 第2页 第3页
相关技术
方法装置相关技术
智能释放相关技术
张磊发明人的其他相关专利技术