首页> 中国专利> 对象引用方法、装置、设备及存储介质

对象引用方法、装置、设备及存储介质

摘要

本申请实施例提供了一种对象引用方法、装置、设备及存储介质,其中,所述对象引用方法包括:获取虚拟机上所运行程序的引用对象所引用的至少一个被引用对象,得到被引用对象集合;当所述被引用对象集合所占用的内存达到阈值时,按照所述被引用对象集合中的被引用对象的优先级由低到高的顺序,依次对所述被引用对象集合中的被引用对象进行释放。通过本申请,能够防止被引用对象占用内存所导致的内存溢出。

著录项

  • 公开/公告号CN112306894A

    专利类型发明专利

  • 公开/公告日2021-02-02

    原文格式PDF

  • 申请/专利权人 腾讯科技(深圳)有限公司;

    申请/专利号CN201910690893.X

  • 发明设计人 魏路;

    申请日2019-07-29

  • 分类号G06F12/02(20060101);G06F9/455(20060101);

  • 代理机构11270 北京派特恩知识产权代理有限公司;

  • 代理人李梅香;张颖玲

  • 地址 518000 广东省深圳市南山区高新区科技中一路腾讯大厦35层

  • 入库时间 2023-06-19 09:44:49

说明书

技术领域

本申请实施例涉及计算机技术领域,涉及但不限于一种对象引用方法、装置、设备及存储介质。

背景技术

目前,Java虚拟机(Java Virtual Machine,JVM)具有四种引用方式:强引用、软引用、弱引用和虚引用。

其中,强引用关联的对象是不释放就一直不会被JVM回收,属于不可回收的资源;软引用关联的对象是如果内存空间足够就不会被回收,但是如果内存空间不足就会被回收;弱引用关联的对象是无论内存是否充足都会被回收;虚引用关联的对象是在任何时候都可能被回收。

但是,在强引用情况下,由于强引用关联的对象一直不会被JVM回收,那么如果强引用关联的对象达到内存上限时,就会直接导致内存溢出(Out of Memory,OOM),从而程序崩溃。在其他三种引用情况下,由于所引用的对象在内存上限或者在回收时机时会被释放,即会不预期的将全部对象进行释放,因此可能会在程序再次使用该引用方式时,对象已经被释放,从而导致程序空指针异常崩溃或无法按照原来逻辑执行。

发明内容

本申请实施例提供一种对象引用方法、装置、设备及存储介质,能够对被引用对象进行有序释放,防止被引用对象占用内存所导致的内存溢出。

本申请实施例的技术方案是这样实现的:

本申请实施例提供一种对象引用方法,包括:

获取虚拟机上所运行程序的引用对象所引用的至少一个被引用对象,得到被引用对象集合;

当所述被引用对象集合所占用的内存达到阈值时,按照所述被引用对象集合中的被引用对象的优先级由低到高的顺序,依次对所述被引用对象集合中的被引用对象进行释放。

本申请实施例提供一种对象引用装置,包括:

获取模块,用于获取虚拟机上所运行程序的引用对象所引用的至少一个被引用对象,得到被引用对象集合;

释放模块,用于当所述被引用对象集合所占用的内存达到阈值时,按照所述被引用对象集合中的被引用对象的优先级由低到高的顺序,依次对所述被引用对象集合中的被引用对象进行释放。

本申请实施例提供一种对象引用设备,包括:

存储器,用于存储可执行指令;处理器,用于执行所述存储器中存储的可执行指令时,实现上述的对象引用方法。

本申请实施例提供一种存储介质,存储有可执行指令,用于引起处理器执行时,实现上述的对象引用方法。

本申请实施例具有以下有益效果:

当被引用对象集合所占用的内存达到阈值时,按照被引用对象集合中的被引用对象的优先级由低到高的顺序,依次对被引用对象集合中的被引用对象进行释放,这样,能够对被引用对象进行有序释放,不会一次性对全部被引用对象进行释放,也不会使被引用对象始终保存不被释放,从而能够防止被引用对象占用内存所导致的内存溢出。

附图说明

图1是本申请实施例提供的对象引用方法的应用场景示意图;

图2是本申请实施例提供的物理机的结构示意图;

图3是本申请实施例提供的对象引用方法的一个可选的流程示意图;

图4是本申请实施例提供的对象引用方法的一个可选的流程示意图;

图5是本申请实施例提供的对象引用方法的一个可选的流程示意图;

图6A是本申请实施例提供的对象引用方法的一个可选的流程示意图;

图6B是本申请实施例提供的对象引用方法的一个可选的流程示意图;

图7是本申请实施例提供的智能引用装置的结构示意图;

图8是本申请实施例提供的智能引用方法的实现流程示意图;

图9是本申请实施例提供的智能引用方法中对对象进行恢复的实现流程示意图。

具体实施方式

为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。

在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。

除非另有定义,本申请实施例所使用的所有的技术和科学术语与属于本申请实施例的技术领域的技术人员通常理解的含义相同。本申请实施例所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。

对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。

1)引用,是将一个对象赋值给一个变量的过程。提到引用,首先想到的就是赋值语句,即一个变量指向了一个对象,这就是最普遍的引用方式。在Java的内存管理和内存回收过程中,程序员是不需要进行插手的,就垃圾回收器过程而言,可以通过可达性分析算法来判断一个对象有没有被引用,倘若没有被引用的话,就会被Java虚拟机(Java VirtualMachine,JVM)标记,有很大可能性会被回收。

2)Java虚拟机,是一种抽象化的计算机,是可运行Java代码的假想计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。其中,JVM有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

3)垃圾回收器(Garbage Collection,GC),是Java虚拟机中的一个进程,是Java平台中使用最频繁的一种对象销毁工具。垃圾回收器会全程侦测Java应用程序的运行情况。当发现有些对象成为垃圾时,垃圾回收器就会销毁这些对象,并释放这些对象所占用的内存空间。也就是说,垃圾回收器会定时的去查看某个对象是否有被其它对象所引用,当在某一时刻该对象不再被其它对象所引用,此时该对象随时都可以被回收,从而清理该对象所占内存。

为了更好地理解本申请实施例中提供的对象引用方法,下面首先对相关技术中的对象引用方法进行分析说明。

在Java技术中,JVM从1.2版本开始引入了四种引用方式,包括:强引用、软引用、弱引用和虚引用。这四种引用方式的级别由高到低依次为:强引用>软引用>弱引用>虚引用。

其中,强引用是指创建一个对象并把这个对象赋给一个引用变量,那么这个对象可以称为强引用对象,强引用是一种对象不释放就一直不会被JVM回收的引用,强引用对象属于不可回收的资源,垃圾回收器绝不会回收它。当内存空间不足时,JVM宁愿抛出内存不足错误(Out Of Memory Error),使程序异常终止,也不会靠回收强引用对象,来解决内存不足的问题。

软引用的性质属于可有可无的那种,对于软引用对象,如果此时内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收软引用对象,该软引用对象就可以被程序使用。GC机制会在保证虚拟机抛出OutOf Memory Error之前清除软引用对象,同时如果有引用队列引用时,软引用对象会加入队列。若一个对象只具有软引用,则当空间不足的时候才会回收它,那么,这个对象就可以用来构建敏感数据的缓存,例如,网页缓存、图片缓存等。软引用可以和一个引用队列一同使用,当软引用所引用的对象被回收,软引用便被加入到引用队列。

弱引用的性质也是可有可无的状态。如果一个引用对象是弱引用对象,一旦垃圾回收器在执行期间确定了该对象为弱引用对象,那么不论是否内存溢出都会执行GC机制,同时如果有引用队列引用该弱引用对象,则该弱引用对象会加入队列。也就是说,弱引用是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。弱引用可以用来构建敏感数据的缓存,例如,用于生命周期更短的,且对内存更敏感的场景中。

需要说明的是,弱引用和软引用的区别在于,弱引用对象拥有更短的生命周期,只要垃圾回收器扫描到它,不管内存空间充足与否,都会回收它的内存。

虚引用所引用的对象属于虚可到达对象时,如果有引用队列,虚引用对象便会加入队列,但是虚引用的特点在于被虚引用的对象的生命周期不会受到影响。虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。如果一个对象与虚引用关联,则跟没有引用与之关联一样,虚引用对象在任何时候都可能被垃圾回收器回收。即,如果一个对象拥有虚引用,则在任何时候都可能被回收。需要说明的是虚引用必须和引用队列联合使用,当所引用的对象被回收,虚引用便被加入到引用队列,主要目的是用来追踪垃圾回收过程。

目前JVM的各种引用方式都无法避免由于开发者疏忽导致内存泄露问题,一旦一些强引用没有被合理释放,当Java内存不断增加时,对于内存较小的移动设备就容易出现OOM,导致程序崩溃。

那么,对于JVM虚拟机的四种引用:强引用、弱引用、软引用和虚引用,其中强引用是不释放就一直不会被JVM回收的引用,这种引用关联的强引用对象如果达到内存上限则会直接导致OOM,从而程序崩溃。而对于其他引用方式,在内存上限或者回收时机到达时会清除内存中的对象,但是这种不预期的清除时机可能会导致程序再次使用该引用时,该引用所关联的对象已经被释放,导致程序空指针异常崩溃或无法按照原来逻辑执行。

为了解决相关技术中的几种引用方式所存在的缺陷,本申请实施例提出一种对象引用方法、装置、设备及存储介质,通过引入一种智能引用方式,可以在内存达到上限时智能释放一些低优先级的被引用对象,同时保证在后续使用该被引用对象时会重新生成,从而使得开发者可以避免内存泄露的问题,简化开发者对代码内存管理的要求。

下面说明本申请实施例提供的对象引用设备的示例性应用,本申请实施例提供的设备可以实施为物理机中的控制程序。下面,将说明设备实施为物理机中的控制程序时的示例性应用。

参见图1,图1是本申请实施例提供的对象引用方法的应用场景示意图,开发者101通过虚拟机102(例如,可以是Java虚拟机)提供的开发环境121进行程序开发,通过虚拟机102提供的测试环境122对所开发的程序进行测试,并将所开发的程序提交到虚拟机102的线上环境123运行。其中,所述虚拟机102可以作为物理机103的一个进程运行在所述物理机103上,进而实现通过所述物理机103上的虚拟机102来运行所述程序,并将所述程序的运行结果在与所述物理机103连接的客户端104(示例性示出了客户端104-1和客户端104-2)上向用户105(示例性示出了用户105-1和用户105-2)展示,从而实现将开发的APP与用户接触。

在所述物理机103中,还包括用于实现本申请实施例所提供方法的对象引用装置106,该对象引用装置106可以是一控制程序,或者,该对象引用设备也可以是程序和插件等形式的软件,所述对象引用装置与所述虚拟机并行,能够获取所述虚拟机上所运行程序的引用对象所引用的至少一个被引用对象,得到被引用对象集合;并且,当所述被引用对象集合所占用的内存达到阈值时,按照所述被引用对象集合中的被引用对象的优先级由低到高的顺序,向虚拟机发送对象释放指令,以实现依次对所述被引用对象集合中的被引用对象进行释放。

参见图2,图2是本申请实施例提供的物理机103的结构示意图,通过该物理机实现本申请实施例提供的对象引用方法,其中,所述物理机103包括:至少一个处理器210、存储器250、至少一个网络接口220和用户接口230。物理机103中的各个组件通过总线系统240耦合在一起。可理解,总线系统240用于实现这些组件之间的连接通信。总线系统240除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统240。

处理器210可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。

用户接口230包括使得能够呈现媒体内容的一个或多个输出装置231,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口230还包括一个或多个输入装置232,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。

存储器250可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器250可选地包括在物理位置上远离处理器210的一个或多个存储设备。

存储器250包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Memory),易失性存储器可以是随机存取存储器(RAM,Random Access Memory)。本申请实施例描述的存储器250旨在包括任意适合类型的存储器。

在一些实施例中,存储器250能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。

操作系统251,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;

网络通信模块252,用于经由一个或多个(有线或无线)网络接口220到达其他计算设备,示例性的网络接口220包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;

显示模块253,用于经由一个或多个与用户接口230相关联的输出装置231(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);

输入处理模块254,用于对一个或多个来自一个或多个输入装置232之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。

在一些实施例中,本申请实施例提供的装置可以采用软件方式实现,图2示出了存储在存储器250中的对象引用装置106,其可以是程序和插件等形式的软件,包括以下软件模块:获取模块1061和释放模块1062,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。

在另一些实施例中,本申请实施例提供的装置可以采用硬件方式实现,作为示例,本申请实施例提供的装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本申请实施例提供的对象引用方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(ASIC,Application Specific Integrated Circuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,ComplexProgrammable Logic Device)、现场可编程门阵列(FPGA,Field-Programmable GateArray)或其他电子元件。

下面将结合本申请实施例提供的物理机的示例性应用和实施,说明本申请实施例提供的对象引用方法。

参见图3,图3是本申请实施例提供的对象引用方法的一个可选的流程示意图,将结合图3示出的步骤进行说明。

步骤S301,获取虚拟机上所运行程序的引用对象所引用的至少一个被引用对象,得到被引用对象集合。

这里,所述虚拟机运行在所述物理机上,在所述物理机上,还运行有执行本申请实施例对象引用方法的控制程序或者软件,所述控制程序或者软件实施为对象引用装置,通过该对象引用装置实现本申请实施例的对象引用方法。

本申请实施例中,所述引用对象可以为所述虚拟机上所运行程序的任意一个能够引用其他对象的对象。例如,在一个程序中,所述引用对象可以是一个变量(记为第一变量),所述第一变量通过一个赋值语句指向另一个变量(记为第二变量),则该第二变量即为所述被引用对象。

所述被引用对象是被所述引用对象所引用的对象。例如,在一个程序中,所述被引用对象也可以是一个变量,即第二变量,该第二变量可以通过一个赋值语句被第一变量引用。

需要说明的是,本申请实施例中,所述引用对象可以为至少一个,也就是说,所述引用对象可以是所述程序的任意一个或多个变量,只要所述变量引用其他对象,该变量即可被认为是引用对象。对应地,只要一个变量被所述引用对象引用,则可以认为该变量为被引用对象。

所述被引用对象集合中包括至少一个被引用对象,当在所述进程中发生变量之间的引用时,即形成所述引用对象集合,以存储至少一个被引用对象。

本申请实施例中,所述引用对象引用被引用对象可以采用预设引用方式,该预设引用方式不同于相关技术中的四种引用方式中的任意一种,该预设引用方式能够实现相关技术中的四种引用方式所不能实现的引用过程和被引用对象的释放过程。

需要说明的是,所述预设引用方式与相关技术中的四种引用方式可以并存,即在一个程序中,可以既包括采用相关技术中的引用方式所引用的被引用对象,还包括采用所述预设引用方式所引用的被引用对象。

步骤S302,当所述被引用对象集合所占用的内存达到阈值时,按照所述被引用对象集合中的被引用对象的优先级由低到高的顺序,依次对所述被引用对象集合中的被引用对象进行释放。

这里,由于所述被引用对象集合中的被引用对象均是采用预设引用方式所引用的对象,因此,在物理机的内存中,会分配用户缓存该被引用对象集合的存储空间。同时,还会设置该被引用对象集合所占用内存的最大值,即所述阈值。在一些实施例中,可以由开发人员通过物理机来设置该阈值,也可以由开发人员通过对象引用装置来设置该阈值。

当所述被引用对象集合所占用的内存达到阈值时,表明当前内存中所存储的被引用对象的数量较多,而如果一旦被引用对象超出内存中可存储被引用对象的内存上限时,且不对所多出的被引用对象进行释放回收的话,就会导致内存溢出,从而使得虚拟机上所运行的程序崩溃。

因此,本申请实施例中,当所述被引用对象集合所占用的内存达到阈值时,需要对部分被引用对象进行释放,在实现的过程中,可以根据每一被引用对象的优先级,按照优先级由低到高的顺序,依次进行释放,从而通过垃圾回收器对被引用对象进行回收。

需要说明的是,本申请实施例中,对预设引用方式所引用的被引用对象进行释放时,并不是一次性全部释放,而是按照优先级顺序依次释放,也就是说,对被引用对象集合中的被引用对象进行释放的过程是逐步进行的,这样,可以保证对内存的有效释放,在每释放一个被引用对象之后均可以对当前剩余的被引用对象所占用内存的大小进行再次检测,当当前剩余的被引用对象所占用内存的大小满足预设条件时,则可以停止对被引用对象集合中的被引用对象的释放。也就是说,当释放预设数量的所述被引用对象之后,且未被释放的剩余被引用对象所占用的内存小于或等于一定的内存阈值时,停止对所述被引用对象的释放。

当在后续程序的进一步运行过程中,如果被引用对象集合中的被引用对象所占用内存再次增加到所述阈值时,则继续开始释放过程。如此循环执行,实现了对内存的实时监控和动态调整,保证内存占用始终保持在合理范围之内,从而保证程序能够有序执行,防止程序运行崩溃。

举例来说,在虚拟机上所运行程序的引用对象D1所引用的被引用对象包括A1、B1和C1,因此,被引用对象A1、B1和C1形成所述被引用对象集合。如果检测到当前被引用对象集合所占用的内存达到阈值K1时,即被引用对象A1、B1和C1占用的总内存达到阈值K1时,则需要对被引用对象集合中的被引用对象A1、B1和C1中的部分被引用对象进行释放。其中,被引用对象A1、B1和C1的优先级由高到低的顺序为:A1>B1>C1,那么,在对被引用对象集合中的被引用对象进行释放时,首先释放被引用对象C1,在释放被引用对象C1之后,确定所剩余的被引用对象A1和B1所占用的内存大小。如果被引用对象A1和B1所占用的内存大小小于内存阈值K2,则认为未被释放的剩余被引用对象所占用的内存大小满足预设条件,因此,停止对被引用对象A1和B1的释放;如果被引用对象A1和B1所占用的内存大小大于K2,则认为未被释放的剩余被引用对象所占用的内存不满足预设条件,因此继续对被引用对象B1进行释放。如果在后续程序的进一步运行过程中,被引用对象集合中又新增加了被引用对象E1,则确定被引用对象A1和E1所占用的内存是否达到阈值K1,并继续执行后续的释放过程。

本申请实施例提供的对象引用方法,当被引用对象集合所占用的内存达到阈值时,按照被引用对象集合中的被引用对象的优先级由低到高的顺序,依次对被引用对象集合中的被引用对象进行释放,这样,能够对被引用对象进行有序释放,不会一次性对全部被引用对象进行释放,也不会使被引用对象始终保存不被释放,从而能够防止被引用对象占用内存所导致的内存溢出。

在一些实施例中,基于图3,在步骤S302中依次对所述被引用对象集合中的被引用对象进行释放之前,所述方法还包括:

步骤S310,根据每一被引用对象被引用的频率,确定对应被引用对象的优先级。

这里,当获取到虚拟机上所运行程序的引用对象所引用的至少一个被引用对象,得到被引用对象集合之后,可以根据每一被引用对象被引用的频率,确定该被引用对象的优先级。

所述被引用对象被引用的频率可以为在所述程序中,不同引用对象对所述被引用对象所引用的次数或频率,或者同一引用对象对所述被引用对象所引用的次数或频率。当某一被引用对象被引用的频率越高,则对应地该被引用对象的优先级越高,反之,当某一被引用对象被引用的频率越低,则对应地该被引用对象的优先级越低。

当确定出每一被引用对象的优先级之后,可以将对应被引用对象的优先级作为该被引用对象的属性信息与所述被引用对象一起形成所述被引用对象集合,并存储在电子设备(即上述物理机)的内存中,这样,当后续对该被引用对象进行释放时,可以当获取被引用对象时,同时获取该被引用对象的优先级,进而根据每一被引用对象的优先级进行基于优先级高低顺序的释放过程。

本申请实施例提供的对象引用方法,根据每一被引用对象被引用的频率,确定对应被引用对象的优先级,这样,对于引用频率低的被引用对象,说明该被引用对象会再次被引用的概率较小,因此将引用频率低的被引用对象确定为具有较低优先级的被引用对象,从而在当内存占用达到阈值时,优先对引用频率低的被引用对象进行释放,保证了后续引用过程中可能更少的对被引用对象进行恢复,提高程序执行的效率,从而降低程序运行的时延。

在一些实施例中,如图4所示,基于图3,在步骤S302之后,还可以执行:

步骤S401,通过序列化处理,将所释放的被引用对象存储至预设存储单元。

这里,在对被引用对象进行释放之后,会对该被引用对象进行备份,将所释放的被引用对象存储至预设存储单元中,以保证在后续程序运行过程中,如果需要再次对所释放的被引用对象进行引用时,可以从该预设存储单元中恢复该被引用对象,实现对所释放的被引用对象的再次引用,从而保证程序的正常运行。

本申请实施例中,在存储被释放的被引用对象之前,可以先对这些被引用对象进行序列化处理,其中,序列化处理是指将被释放的被引用对象的状态信息转换为可以存储或传输的形式的过程,在序列化处理期间,被释放的被引用对象将其当前状态写入到临时或持久性存储区(即所述预设存储单元)中,以后,可以通过从存储区中读取或反序列化处理被释放的被引用对象的状态,从而重新创建该被释放的被引用对象。

在一些实施例中,如图4所示,所述方法还可以包括以下步骤:

步骤S402,当对所释放的被引用对象进行引用时,将所释放的被引用对象恢复到电子设备的内存中。

这里,当再次对所释放的被引用对象进行引用时,可以从所述预设存储单元中将所释放的被引用对象恢复到电子设备的内存中。

需要说明的是,本申请实施例中,包括以下两种对所释放的被引用对象的恢复方式:

第一种,只恢复再次引用的对象,即只恢复再次引用的且被存储于预设存储单元中的所释放的被引用对象。

第二种,在恢复再次引用的对象的同时,还恢复另外一些对象,即在恢复再次引用的且被存储于预设存储单元中的所释放的被引用对象的同时,还恢复被存储于预设存储单元中的其他的所释放的被引用对象。

在一些实施例中,图5所示,是本申请实施例提供的对象引用方法的一个可选的流程示意图,请同时结合图4和图5所示,步骤S402还可以通过以下步骤实现:

步骤S4021,当对所释放的被引用对象进行引用时,从所述预设存储单元中确定待恢复对象。

这里,所释放的被引用对象存储于预设存储单元中,当对预设存储单元中所存储的对象进行引用时,即表明当前存在引用对象对所释放的被引用对象进行引用,因此,从所述预设存储单元中确定待恢复对象。

所述待恢复对象为一个或多个,所述待恢复对象可以包括当前的引用对象所要引用的被引用对象,或者,所述待恢复对象除了包括当前的引用对象所要引用的被引用对象之外,还可以包括其他不被当前的引用对象所要引用的对象。

步骤S4022,对所述待恢复对象进行反序列化处理。

在确定出待恢复对象之后,对每一待恢复对象进行反序列化处理。这里的反序列化处理是与上述序列化处理完全相反的过程,通过反序列化处理,可以处理所述待恢复对象的状态,从而重新创建被释放的被引用对象。

步骤S4023,将反序列化处理后的待恢复对象存储至所述被引用对象集合中,以实现将所释放的被引用对象恢复到电子设备的内存中。

这里,在对待恢复对象进行反序列化处理之后,将反序列化处理后的待恢复对象存储至所述被引用对象集合中,这样即实现了对待恢复对象的恢复过程,即将所释放的被引用对象恢复到电子设备的内存中。

本申请实施例中,由于所释放的被引用对象被恢复且重新存储至被引用对象集合中,因此,所释放的被引用对象在后续的程序运行过程中可以继续被引用对象进行引用。

在一些实施例中,由于所述待恢复对象可以为一个,所述待恢复对象包括当前的引用对象所要引用的被引用对象。

那么,如图6A所示,是本申请实施例提供的对象引用方法的一个可选的流程示意图,请同时结合图5和图6A所示,步骤S4021还可以通过以下步骤实现:

步骤S601,确定当前的引用对象所要引用的对象是否是所述预设存储单元中的所释放的被引用对象。

步骤S602,当对所释放的被引用对象进行引用时,从所述预设存储单元中,确定所引用的所述所释放的被引用对象为所述待恢复对象。

这里,由于所述待恢复对象为一个,因此,在恢复所释放的被引用对象时,仅恢复当前的引用对象所要引用的被引用对象。那么,在确定待恢复对象时,即将所引用的所述所释放的被引用对象确定为所述待恢复对象。这样,可以实现在对待恢复对象进行恢复时,仅恢复所引用的所述所释放的被引用对象。

举例来说,在预设存储单元中包括所释放的被引用对象A2、B2和C2。如果当前存在引用对象D2要对被引用对象B2进行引用,因此需要从预设存储单元中恢复所释放的被引用对象B2,即在实现对所释放的被引用对象的恢复时,只恢复所释放的被引用对象B2。

本申请实施例中,通过将所引用的所述所释放的被引用对象确定为所述待恢复对象,从而只恢复引用对象所引用的所述所释放的被引用对象,即实现了上述第一种对所释放的被引用对象进行恢复的恢复方式:即只恢复再次引用的且被存储于预设存储单元中的所释放的被引用对象。

在一些实施例中,由于所述待恢复对象可以为多个,所述待恢复对象除了包括当前的引用对象所要引用的被引用对象之外,还可以包括其他不被当前的引用对象所要引用的对象。

那么,如图6B所示,是本申请实施例提供的对象引用方法的一个可选的流程示意图,请同时结合图5和图6B所示,步骤S4021还可以通过以下步骤实现:

步骤S611,确定当前的引用对象所要引用的对象是否是所述预设存储单元中的所释放的被引用对象。

步骤S612,当对所释放的被引用对象进行引用时,从所述预设存储单元中,将所引用的所述所释放的被引用对象和具有预设优先级的所述所释放的被引用对象,确定为所述待恢复对象。

这里,由于所述待恢复对象为多个,因此,在恢复所释放的被引用对象时,不仅恢复当前的引用对象所要引用的被引用对象,还恢复其他不被当前的引用对象所要引用的对象。那么,在确定待恢复对象时,即将所引用的所述所释放的被引用对象和其他不被当前的引用对象所引用的所释放的被引用对象确定为所述待恢复对象。这样,可以实现在对待恢复对象进行恢复时,同时恢复所引用的所述所释放的被引用对象和不被引用的所述所释放的被引用对象。

在一些实施例中,该其他不被当前的引用对象所要引用的对象,可以具有预设优先级,例如,其他不被当前的引用对象所要引用的对象的优先级高于所述当前的引用对象所要引用的被引用对象。也就是说,在恢复当前的引用对象所要引用的被引用对象自身的同时,还要将比该被引用对象自身优先级更高的其他所释放的被引用对象同时进行恢复。

举例来说,在预设存储单元中包括所释放的被引用对象A3、B3和C3,其中,所释放的被引用对象A3、B3和C3的优先级由高到低的顺序为:A3>B3>C3。如果当前存在引用对象D3要对被引用对象B3进行引用,因此需要从预设存储单元中恢复所释放的被引用对象B3,但是在恢复B3的同时,会对比B3优先级高的A3同时进行恢复,即在实现对所释放的被引用对象的恢复时,是同时恢复A3和B3的。

本申请实施例中,通过将所引用的所述所释放的被引用对象和比该被引用对象自身优先级更高的其他所释放的被引用对象,确定为所述待恢复对象,从而不仅恢复当前的引用对象所要引用的被引用对象自身,还要将比该被引用对象自身优先级更高的其他所释放的被引用对象同时进行恢复,即实现了上述第二种对所释放的被引用对象进行恢复的恢复方式:在恢复再次引用的对象的同时,还恢复另外一些对象。

下面,将说明本申请实施例在一个实际的应用场景中的示例性应用。

基于相关技术中的对象引用方法所存在的问题,本申请实施例再提供一种对象引用方法,引入智能引用方式,该智能引用方式作为一种新的引用方式,可以在内存达到上限时智能释放一些低优先级的被引用对象,同时保证在后面使用该被引用对象时会重新生成,从而使得开发者可以避免内存泄露的问题,简化他们对代码内存管理的要求,开发者在云端对用户本地应用程序进行调试。

本申请实施例要解决的关键技术包括:通过智能引用库,在open jdk软件的拓展库添加智能引用相关的应用程序接口(Application Programming Interface,API)和Class类,实现可调用的智能引用类;通过智能垃圾回收机,改进目前主流JVM虚拟机,增加其对智能引用的对象清理的判断。

下面对本申请实施例的关键技术进行详细说明。

开发者在一些内存紧张的场景或内存很难管理的时候,可以将一些对象的引用从强引用改成本申请实施例的智能引用,同时无需费心其被引用对象的生命周期管理。当采用智能引用方式所引用的智能引用对象(即被引用对象)越来越多达到内存上限时,会触发智能垃圾回收机的GC,智能垃圾回收机会对这些智能引用对象按照优先级高低进行释放,直到内存恢复到合理区间。也就是说,智能引用方式,并不考虑对象的生命周期,当内存达到上限时,只是按照智能引用对象的优先级,依次进行回收。

在释放智能引用对象时,会对该智能引用对象进行备份,即将智能引用对象序列化到硬盘中。如果后面程序再此使用到该智能引用对象,JVM会读取硬盘里的序列化文件,并通过反序列化操作生成该智能引用对象,从而程序可以继续对该智能引用对象进行无缝衔接般地使用。

开发者以后无需费脑关心对象的生命周期以及查内存泄露问题了只需使用智能引用,并为智能引用对象设置回收优先级,设置可以无需设置优先级,让智能回收算法动态调节优先级,使得回收效率更高。

图7是本申请实施例提供的智能引用装置的结构示意图,其中,对象引用方法可以为智能引用方法,对象引用装置可以为智能引用装置,如图7所示,所述智能引用装置700包括:Java智能引用库701和Java智能垃圾回收机702。

基于图7的智能引用装置,如图8所示,是本申请实施例提供的智能引用方法的实现流程示意图,所述方法包括以下步骤:

步骤S801,开发者80进行程序开发,编写带有智能引用方式的Java程序,得到应用程序81。

步骤S802,当所述应用程序中执行到智能引用时,调用Java智能引用库70存储智能引用对象。

步骤S803,将智能引用对象的ID传给JVM虚拟机。

步骤S804,当内存达到上限时,Java智能垃圾回收机702对内存82进行回收清理,回收智能引用对象。

图8中示出了,对于智能引用对象A、B和C,Java智能垃圾回收机回收智能引用对象A和B,保留智能引用对象C。

步骤S805,Java智能垃圾回收机将所回收的智能引用对象A和B进行序列化处理,并存储至硬盘83中。

本申请实施例提供的智能引用方法,假设应用程序中有A、B和C三个智能引用对象,当内存满时,Java智能垃圾回收机通过智能算法算出最新程序中哪些智能引用对象使用概率高,哪些智能引用对象使用概率低,即热点对象的清理优先级低于最近不常使用对象。假设Java智能垃圾回收机得到A和B的清理优先级高于C,且同时清理A和B可以满足正常内存使用,则将A和B进行序列化到硬盘,同时内存中清理智能引用对象A和B。

当应用程序后续再次执行到A或B时,此时会唤起Java智能垃圾回收机对A或B进行恢复,如图9所示,是本申请实施例提供的智能引用方法中对对象进行恢复的实现流程示意图,其中,恢复过程包括以下步骤:

步骤S901,开发者80进行程序开发,编写带有智能引用方式的Java程序,得到应用程序81。

步骤S902,当再次执行到智能引用时,调用Java智能引用库701获取智能引用对象。

步骤S903,将智能引用对象的ID传给JVM虚拟机。

步骤S904,如果所引用的智能引用对象为被Java智能垃圾回收机702所回收的对象,则在硬盘83中读取智能引用对象的序列化信息。

步骤S905,Java智能垃圾回收机702对智能引用对象进行反序列化处理,生成被引用对象至内存82中。

本申请实施例中,当应用程序执行到已经释放的智能对象时,会调起java智能垃圾回收机进行智能引用对象的恢复。在一些实施例中,恢复可以并不是缺少什么恢复什么,会采用智能算法估计最近代码区域会使用到的热点智能引用,并对这些智能引用已经释放的对象进行反序列化生成,从而避免每次执行时都需要恢复一次的低效过程。

本申请实施例提供的对象引用方法,能够减少开发者对于内存管理的工作,使得应用的开发者可以更全身心的投入业务开发中。相比于相关技术中的指针需要手动释放的问题,相关技术增大了程序员的工作量以及代码的维护难度,并且,相关技术中的Java技术采用垃圾回收机制能够一定程度的减轻了程序员对于内存的管理,但是在某些场景下,程序员错误的强引用还是会导致内存无法释放,在移动应用中由于内存受限所以对Java程序员内存管理还是有很多要求。而本申请实施例的对象引用方法,通过智能引用方式可以彻底解放程序员对内存的管理,降低开发门槛和代码维护。

另外,本申请实施例提供的对象引用方法,还能够解决一些应用中出现的内存泄露问题,因为内存泄露有时特别隐蔽,很难查找,而通过智能引用方式,即使内存泄露也不会导致程序崩溃,因为智能引用对象会在内存过高时被释放掉。

下面继续说明本申请实施例提供的对象引用装置255的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器250的对象引用装置106中的软件模块可以包括:

获取模块1061,用于获取虚拟机上所运行程序的引用对象所引用的至少一个被引用对象,得到被引用对象集合;

释放模块1062,用于当所述被引用对象集合所占用的内存达到阈值时,按照所述被引用对象集合中的被引用对象的优先级由低到高的顺序,依次对所述被引用对象集合中的被引用对象进行释放。

在一些实施例中,所述装置还包括:

确定模块,用于根据每一被引用对象被引用的频率,确定对应被引用对象的优先级。

在一些实施例中,所述装置还包括:

存储模块,用于在对所述被引用对象集合中的被引用对象进行释放之后,通过序列化处理,将所释放的被引用对象存储至预设存储单元。

在一些实施例中,所述装置还包括:

恢复模块,用于当对所释放的被引用对象进行引用时,将所释放的被引用对象恢复到电子设备的内存中。

在一些实施例中,所述恢复模块还用于:

当对所释放的被引用对象进行引用时,从所述预设存储单元中确定待恢复对象;对所述待恢复对象进行反序列化处理;将反序列化处理后的待恢复对象存储至所述被引用对象集合中,以实现将所释放的被引用对象恢复到电子设备的内存中。

在一些实施例中,所述恢复模块还用于:

当对所释放的被引用对象进行引用时,从所述预设存储单元中,确定所引用的所述所释放的被引用对象为所述待恢复对象。

在一些实施例中,所述恢复模块还用于:

当对所释放的被引用对象进行引用时,从所述预设存储单元中,将所引用的所述所释放的被引用对象和具有预设优先级的所述所释放的被引用对象,确定为所述待恢复对象。

需要说明的是,本申请实施例装置的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果,因此不做赘述。对于本装置实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。

本申请实施例提供一种存储有可执行指令的存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的方法,例如,如图3示出的方法。

在一些实施例中,存储介质可以是铁电存储器(Ferromagnetic Random AccessMemory,FRAM)、只读存储器(Read Only Memory,ROM)、可编程只读存储器(ProgrammableRead Only Memory,PROM)、可擦除可编程只读存储器(Erasable Programmable Read OnlyMemory,EPROM)、带电可擦可编程只读存储器(Electrically Erasable ProgrammableRead Only Memory,EEPROM)、闪存、磁表面存储器、光盘、或光盘只读存储器(CompactDisk-Read Only Memory,CD-ROM)等存储器;也可以是包括上述存储器之一或任意组合的各种设备。

在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。

作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。

作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。

以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号