Java虚拟机的垃圾回收方法、装置、设备和存储介质与流程

文档序号:17488702发布日期:2019-04-23 20:13阅读:154来源:国知局
Java虚拟机的垃圾回收方法、装置、设备和存储介质与流程

本发明涉及计算机技术领域,尤其涉及java虚拟机的垃圾回收方法、装置、设备和存储介质。



背景技术:

java程序设计语言是由sun公司推出的跨平台面向对象高级程序设计语言,它的可执行代码是编译以后统一标准的java字节码(bytecode)。java语言依赖于称为java虚拟机(javavirtualmachine,jvm)的虚拟机。

在java虚拟机中,垃圾回收就是自动释放不再被程序所使用的对象的过程。垃圾回收方法必须能断定哪些对象是不再被引用的,哪些对象是活动的,并且能够把不再被引用的对象所占据的空间释放出来,而不影响活动对象。以避免在硬件内存较小的系统中,碎片会导致虚拟机产生不必要的“内存不足”错误。如何将java虚拟机的垃圾回收把用户从释放占用内存的重担中解救出来。同时能够保持程序完整性,避免因失误(或故意)错误地释放内存而导致java虚拟机的崩溃成为了目前亟待解决的技术问题。



技术实现要素:

本发明的主要目的在于提供一种java虚拟机的垃圾回收方法、装置、设备和存储介质,旨在提高java虚拟机垃圾回收的合理性。

为实现上述目的,本发明提供java虚拟机的垃圾回收方法,所述java虚拟机的垃圾回收方法包括以下步骤:

通过预设垃圾回收器扫描java虚拟机的内存,得到所述java虚拟机的内存分区信息;

根据所述内存分区信息将所述java虚拟机的内存划分新生代和老年代,从预设分代算法库中获取与所述内存分区信息匹配的目标分代算法;

按所述目标分代算法处理所述新生代和所述老年代,统计处理完成后所述新生代的第一使用率和所述老年代的第二使用率;

根据所述第一使用率和/或所述第二使用率确定回收策略,并按所述回收策略进行垃圾回收。

可选地,所述根据所述内存分区信息将所述java虚拟机的内存划分新生代和老年代,从预设分代算法库中获取与所述内存分区信息匹配的目标分代算法的步骤,包括:

获取所述内存分区信息中的堆栈设置信息,并将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代;

获取所述内存分区信息中的存储数据,并将所述存储数据与预设分类表进行比对,得到所述内存分区信息对应的类型属性;

从预设分代算法库中获取与所述类型属性匹配的预设分代算法,并将所述预设分代算法作为目标分代算法。

可选地,所述根据所述内存分区信息将所述java虚拟机的内存划分新生代和老年代,从预设分代算法库中获取与所述内存分区信息匹配的目标分代算法的步骤,包括:

获取所述内存分区信息中的堆栈设置信息,并将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代;

将所述内存分区信息输入至预设算法选择模型,通过所述预设算法选择模型处理所述内存分区信息,得到所述内存分区信息对应的处理指标;

从预设分代算法库中获取与所述处理指标匹配的预设分代算法,并将所述预设分代算法作为目标分代算法。

可选地,所述按所述目标分代算法处理所述新生代和所述老年代,统计处理完成后所述新生代的第一使用率和所述老年代的第二使用率的步骤,包括:

获取所述内存分代算法中的对象处理方法,并按所述对象处理方法处理所述新生代中所有可达对象;

在检测到所述新生代中的各所述可达对象处理完成后,获取所述新生代第一已使用内存和第一总内存,及所述老年代的第二已使用内存和第二总内存;

将所述第一已使用内存和第一总内存的比值作为所述新生代的第一使用率,将所述第二已使用内存和第二总内存的比值作为所述老年代的第二使用率。

可选地,所述获取所述内存分代算法中的对象处理方法,并按所述对象处理方法处理所述新生代中所有可达对象的步骤,包括:

将各所述可达对象添加至所述新生代中的survivor区,并确定所述survivor区的当前使用率;

将所述当前使用率与预设使用率进行比较;

若所述当前使用率超过预设使用率,则统计所述survivor区中各所述可达对象标记次数;

将所述标记次数超过预设标记次数的所述可达对象作为目标可达对象,并将所述目标可达对象添加至所述老年代中。

可选地,所述根据所述第一使用率和/或所述第二使用率确定回收策略,并按所述回收策略进行垃圾回收的步骤,包括:

将所述第一使用率与所述第一预设阈值进行比对,以判断是否对所述新生代进行回收;

若所述第一使用率超过所述第一预设阈值,则将所述可达对象复制至目标存储空间;

删除所述新生代内存中除所述目标存储空间之外的空间,以进行所述java虚拟机的垃圾回收。

可选地,所述根据所述第一使用率和/或所述第二使用率确定回收策略,并按所述回收策略进行垃圾回收的步骤,包括:

将所述第二使用率与所述第二预设阈值进行比对,以判断是否对所述老年代进行回收;

若所述第二使用率超过所述第二预设阈值,则获取所述老年代对应的第二回收策略;

按所述第二回收策略发送暂停请求,在检测到当前运行线程全部暂停后,并创建一个进程进行垃圾回收。

此外,为实现上述目的,本发明还提供一种java虚拟机的垃圾回收装置,所述java虚拟机的垃圾回收装置包括:

扫描模块,用于通过预设垃圾回收器扫描java虚拟机的内存,得到所述java虚拟机的内存分区信息;

算法获取模块,用于根据所述内存分区信息将所述java虚拟机的内存划分新生代和老年代,从预设分代算法库中获取与所述内存分区信息匹配的目标分代算法;

使用率确定模块,用于按所述目标分代算法处理所述新生代和所述老年代,统计处理完成后所述新生代的第一使用率和所述老年代的第二使用率;

回收模块,用于根据所述第一使用率和/或所述第二使用率确定回收策略,并按所述回收策略进行垃圾回收。

此外,为实现上述目的,本发明还提供一种java虚拟机的垃圾回收设备;

所述java虚拟机的垃圾回收设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其中:

所述计算机程序被所述处理器执行时实现如上所述的java虚拟机的垃圾回收方法的步骤。

此外,为实现上述目的,本发明还提供计算机存储介质;

所述计算机存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述的java虚拟机的垃圾回收方法的步骤。

本发明实施例提出的一种java虚拟机的垃圾回收方法、装置、设备和存储介质,本发明中根据得到java虚拟机的内存分区信息选择对应的目标分代算法,即,本申请中可以从不同的算法中选择目标分代算法,并根据选择的目标分代算法更加优化地进行新生代和老年代的分代,以按照目标分代算法处理新生代和老年代中的对象,利用目标分代算法处理新生代和老年代中的对象,在处理完成之后,并确定新生代和老年代的使用率,以进行java虚拟机的垃圾回收,有效地避免当前标记计数分代算法的计数不准确的情况,更加合理地进行java虚拟机的垃圾回收,本申请中不需要频繁地进行垃圾回收,提高了java虚拟机的处理性能,使得java虚拟机的垃圾回收更加合理。

附图说明

图1是本发明实施例方案涉及的硬件运行环境的装置结构示意图;

图2为本发明java虚拟机的垃圾回收方法第一实施例的流程示意图;

图3为本发明java虚拟机的垃圾回收装置一实施例的功能模块示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

现有的java虚拟机垃圾回收采用不同的策略,不同的策略对应的java虚拟机垃圾回收方法不同,为了防止java虚拟机内存不足的情况出现,java虚拟机通常进行频繁的垃圾回收,频繁的垃圾回收是可以避免碎片导致的虚拟机产生“内存不足”的情况,但是,频繁的垃圾回收会影响java虚拟机正常的业务流程,如何既有效地避免碎片导致的虚拟机产生“内存不足”的情况,还可以不影响java虚拟机正常的业务流程,使得java虚拟机的垃圾回收更加合理成为了当前亟待解决的技术问题。

本申请中在java虚拟机中预设垃圾回收器扫描java虚拟机内存中的所有区域,获取java虚拟机的内存分区信息,例如,内存分区信息包括:java虚拟机中预先进行堆设置:初始堆大小、最大堆大小、设置年轻代大小、设置年轻代和年老代的比值,如:为3,表示年轻代与年老代比值为1:3;年轻代中eden区与两个survivor区的比值。终端根据扫描得到的内存分区信息选择对应的目标分代算法处理内存中的对象;在按照目标分代算法处理所述新生代和所述老年代之后,终端统计所述新生代的第一使用率和所述老年代的第二使用率,并根据所述第一使用率和/或所述第二使用率确定回收策略;按所述回收策略处理所述java虚拟机的内存,以进行所述java虚拟机的垃圾回收。

本申请中根据java虚拟机的内存分区信息选择不同的分代算法处理目标所述新生代和所述老年代中的对象,实现合理的java虚拟机的垃圾回收。

如图1所示,图1是本发明实施例方案涉及的硬件运行环境的终端(又叫java虚拟机的垃圾回收设备,其中,java虚拟机的垃圾回收设备可以是由单独的java虚拟机的垃圾回收装置构成,也可以是由其他装置与java虚拟机的垃圾回收装置组合形成)结构示意图。

本发明实施例终端可以固定终端,也可以是移动终端,如“物联网设备”、带联网功能的智能空调、智能电灯、智能电源、智能音箱、自动驾驶汽车、pc(personalcomputer)个人计算机,智能手机、平板电脑、电子书阅读器、便携计算机等具有显示功能的终端设备。

如图1所示,该终端可以包括:处理器1001,例如中央处理器centralprocessingunit,cpu),网络接口1004,用户接口1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(display)、输入单元比如键盘(keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如无线保真wireless-fidelity,wifi接口)。存储器1005可以是高速ram存储器,也可以是稳定的存储器(non-volatilememory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。

可选地,终端还可以包括摄像头、rf(radiofrequency,射频)电路,传感器、音频电路、wifi模块;输入单元,比显示屏,触摸屏;网络接口可选除无线接口中除wifi外,蓝牙、探针、3g/4g/5g(前面的数字表示的是蜂窝移动通信网络的代数。就是表示是第几代的网络。英文字母g表示generation)联网基站设备等等。其中,传感器比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器;当然,移动终端还可配置陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。

本领域技术人员可以理解,图1中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

如图1所示,该计算机软件产品存储在一个存储介质(存储介质:又叫计算机存储介质、计算机介质、可读介质、可读存储介质、计算机可读存储介质或者直接叫介质等,如ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及计算机程序。

在图1所示的终端中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;用户接口1003主要用于连接客户端(用户端),与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的计算机程序,并执行本发明以下实施例提供的java虚拟机的垃圾回收方法中的步骤。

参照图2,本发明java虚拟机的垃圾回收方法的第一实施例中,所述java虚拟机的垃圾回收方法包括:

步骤s10,通过预设垃圾回收器扫描java虚拟机的内存,得到所述java虚拟机的内存分区信息。

本发明应用于终端,终端中包含预设垃圾回收器,其中,预设垃圾回收器是指预先设置的用于回收不再使用的内存对象同时对不连续的堆碎片进行整理的程序。预设垃圾回收器通过实时地对java虚拟机的内存进行扫描,预设垃圾回收器需要对java虚拟机的内存进行扫描,确定内存中闲置空间和存储对象,得到java虚拟机的内存分区信息(又叫堆栈设置信息),内存分区信息是指:内存各个区域的信息,堆栈设置信息中包含:初始堆大小、最大堆大小、新生代大小及新生代和老年代比例等等,终端根据内存分区信息可以确定java虚拟机的内存情况,内存中处于空闲状态还是存储有对象等不同的状态。

步骤s20,根据所述内存分区信息将所述java虚拟机的内存划分新生代和老年代,从预设分代算法库中获取与所述内存分区信息匹配的目标分代算法。

终端根据内存分区信息确定java虚拟机的内存情况,即,终端通过扫描得到的内存分区信息可以确定java虚拟机中是否设置新生代和老年代对应的堆栈信息,若设置了设置新生代和老年代对应的堆栈信息,则终端确定新生代与老年代的空间信息;即,终端根据内存分区信息中的新生代的eden区、survivor区的分配,将所述java虚拟机的内存划分新生代和老年代。

例如,java虚拟机内存分区信息中记录有:java虚拟机内存是固定的(比如说10g),内存中存储内容占用的内存是可变的,内存分区信息中的堆栈设置信息中包括初始堆大小8.1g(当前占用内存空间大小),最大堆大小8g(设置的最大占用内存),新生代与老年代的比例为1:3,新生代的边界为xxx1-xxx9,终端根据内存分区信息中新生代的边界,确定新生代的大小,进一步地,根据新生代与老年代的比例为1:3,得到老年代大小,以完成所述java虚拟机的内存新生代和老年代的划分。

在终端将所述java虚拟机的内存划分新生代和老年代之后,终端获取与内存分区信息匹配的目标分代算法,即,终端的java虚拟机中预先设置内存分代算法集合,预设分代算法库中包含有多种内存分代算法,例如,标记-清除算法、复制算法和/或引用计数算法等;终端根据内存分区信息从预设分代算法库中选择匹配的分代算法,作为目标分代算法。

本实施例中终端可以根据内存分区信息选择对应的目标分代算法,是为了使得终端对内存的处理步骤最少,使得终端的对象的处理数量最少,提高java虚拟机的性能,具体地,终端根据内存分区信息从预设分代算法库中选择匹配的预设分代算法作为目标分代算法,是为了使得内存分代的准确性更高,较少频繁的内存回收,使得java虚拟机的垃圾回收更加合理。

步骤s30,按所述目标分代算法处理所述新生代和所述老年代,统计处理完成后所述新生代的第一使用率和所述老年代的第二使用率。

终端按照选定的目标分代算法处理所述新生代中的对象和所述老年代中的对象,例如,终端处理新生代的步骤为:终端从根出发标记新生代中的可达对象,将标记的可达对象移动至新生代的目标区域(survivor区)或者移动到老年代中,在检测到可达对象移动完成之后,终端确定新生代和老年代的使用率,以根据新生代和老年代的使用率确定是否进行java虚拟机的垃圾回收。

例如,终端按目标分代算法处理所述新生代和所述老年代完成之后,终端得到新生代的当前已使用11223k,新生代的总的空间为15360k新生代的可申请空间为13824k,则新生成的使用率为91%,终端确定新生成的使用率为91%超过新生代的使用率的阈值,则进行java虚拟机的垃圾回收。

进一步地,所述步骤s30,包括:

步骤a,获取所述内存分代算法中的对象处理方法,并按所述对象处理方法处理所述新生代中所有可达对象;

步骤b,在检测到所述新生代中的各所述可达对象处理完成后,获取所述新生代第一已使用内存和第一总内存,及所述老年代的第二已使用内存和第二总内存;

步骤c,将所述第一已使用内存和第一总内存的比值作为所述新生代的第一使用率,将所述第二已使用内存和第二总内存的比值作为所述老年代的第二使用率。

即,终端按所述内存分代算法中的对象处理方法,并按所述对象处理方法处理所述新生代中所有可达对象;其中,终端处理可达对象的步骤包括:1、终端从根出发,得到根可以触及的对象作为可达对象,终端可达对象进行标记;2、将各所述可达对象添加至所述新生代中的survivor区,并确定所述survivor区的当前使用率;将所述当前使用率与预设使用率进行比较;预设使用率是指预先设置的survivor区使用率,3、在survivor区的当前使用率超过预设使用率,则统计所述survivor区中各所述可达对象标记次数;4、将所述标记次数超过预设标记次数的所述可达对象作为目标可达对象,并将所述目标可达对象添加至所述老年代中。

在终端检测到所述新生代中的各所述可达对象处理完成后,终端获取所述新生代第一已使用内存和第一总内存,及所述老年代的第二已使用内存和第二总内存;将所述第一已使用内存和第一总内存的比值作为所述新生代的第一使用率,将所述第二已使用内存和第二总内存的比值作为所述老年代的第二使用率。

在本实施例中终端按目标分代算法处理所述新生代和所述老年代,在处理完成之后,终端统计处理完成后所述新生代的第一使用率和所述老年代的第二使用率,以根据新生代和老年代的使用率确定是否进行垃圾回收,减少垃圾回收次数。

步骤s40,根据所述第一使用率和/或所述第二使用率确定回收策略,并按所述回收策略进行垃圾回收。

终端根据所述第一使用率和/或所述第二使用率确定回收策略,即,终端中设置了不同的回收策略,并按所述回收策略进行垃圾回收,使得新生代和老年代的回收互不影响,本实施例中可以单独地根据所述第一使用率进行新生代的垃圾回收,根据所述第二使用率进行老年代的垃圾回收;还可以同时进行新生代和老年代的垃圾回收。

在本实施例中根据得到java虚拟机的内存分区信息选择对应的目标分代算法,即,本申请中可以从不同的算法中选择目标分代算法,并根据选择的目标分代算法更加优化地进行新生代和老年代的分代,以按照目标分代算法处理新生代和老年代中的对象,利用目标分代算法处理新生代和老年代中的对象,在处理完成之后,并确定新生代和老年代的使用率,以进行java虚拟机的垃圾回收,有效地避免当前标记计数分代算法的计数不准确的情况,更加合理地进行java虚拟机的垃圾回收,本申请中不需要频繁地进行垃圾回收,提高了java虚拟机的处理性能,使得java虚拟机的垃圾回收更加合理。

进一步地,在本发明第一实施例的基础上,提出了本发明java虚拟机的垃圾回收方法的本实施例,本实施例是第一实施例中步骤s20的细化,本实施例中给出了确定目标分类算法两种具体实现方式:

实现方式一:根据内存分区信息确定目标分类算法,具体地:

步骤s21,获取所述内存分区信息中的堆栈设置信息,并将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代。

终端获取所述内存分区信息中的堆栈设置信息,其中,堆栈设置信息是指预先设置的空间存储中的堆栈设置数据,终端将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代。

例如,内存分区信息中包括:新生代defnewgeneration空间共:total13824k、已经使用:used11223k、低边界:0x27e80000、当前边界:0x28d80000、最高边界:0x28d80000、新生代内存:(0x28d80000-0x27e80000)/1024/1024=15m、新生代总合:(12288k+1536k+1536k)/1024=15m、新生代可申请内存:13824k=12288k+1536k和生成对象eden空间:space12288k,则终端确定java虚拟机的内存中新生代的空间信息。

步骤s22,获取所述内存分区信息中的存储数据,并将所述存储数据与预设分类表进行比对,得到所述内存分区信息对应的类型属性。

终端获取所述内存分区信息中的存储数据,终端将所述存储数据与预设分类表进行比对,其中,预设分类表是指预先设置的存储数据与类型映射表,例如,预设分类表中包含有存储空间为1xxx对应的类型1;存储空间为2xxx对应类型1。

步骤s23,从预设分代算法库中获取与所述类型属性匹配的预设分代算法,并将所述预设分代算法作为目标分代算法。

终端将类型属性与预设分代算法库中各个分代算法的类型进行比对,终端获取所述预设分代算法库中与所述类型属性匹配的预设分代算法,并将该预设分代算法作为预设分代算法作为目标分代算法。

在本实施例中终端获取所述内存分区信息中的堆栈设置信息,并将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代;进一步地,获取所述内存分区信息中的存储数据,并将所述存储数据与预设分类表进行比对,得到所述内存分区信息对应的类型属性;从预设分代算法库中获取与所述类型属性匹配的预设分代算法,并将所述预设分代算法作为目标分代算法,使得终端选择对应的分代算法处理,避免了仅根据引用计数法处理的误差,通过内存分区信息对应的类型属性选择对应的分代算法,使得内存的分代更加合理。

实现方式二:通过预设算法选择模型确定目标分代算法,具体地:

步骤s24,获取所述内存分区信息中的堆栈设置信息,并将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代。

终端获取所述内存分区信息中的堆栈设置信息,其中,堆栈设置信息是指预先设置的空间存储中的堆栈设置数据,终端将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代。

步骤s25,将所述内存分区信息输入至预设算法选择模型,通过所述预设算法选择模型处理所述内存分区信息,得到所述内存分区信息对应的处理指标;

终端将所述内存分区信息输入至预设算法选择模型中,其中,预设算法选择模型是指预设训练的用于分代算法处理指标生成的模型,所述预设算法选择模型可选地包括adaboost迭代算法分类器、svm(supportvectormachine,支持向量机)分类器。

将所述内存分区信息输入至预设算法选择模型,通过预设算法选择模型对内存分区信息进行处理,得到所述内存分区信息对应的处理指标,其中,处理指标是指分代的指标,例如:处理时间指标、处理效果指标。

步骤s26,从预设分代算法库中获取与所述处理指标匹配的预设分代算法,并将所述预设分代算法作为目标分代算法。

终端将处理指标与预设分代算法库中各个分代算法的指标进行比对,终端获取所述预设分代算法库中与所述处理指标匹配的预设分代算法,并将该预设分代算法作为预设分代算法作为目标分代算法。

在本实施例中预先设置算法选择模型,将所述内存分区信息输入至预设算法选择模型,通过预设算法选择模型对内存分区信息进行处理,得到所述内存分区信息对应的处理指标;从预设分代算法库中获取与所述处理指标匹配的预设分代算法,并将所述预设分代算法作为目标分代算法。使得终端选择对应的分代算法处理,有效地平衡了分代的各个指标数据,使得内存分代更加合理。

在本发明第一实施例的基础上,进一步提出了本发明java虚拟机的垃圾回收方法的本实施例,本实施例是第一实施例中步骤s40的细化,本实施例中给出了垃圾回收的两种具体实现方式:

实现方式一:针对新生代的垃圾回收,具体地:

步骤s41,将所述第一使用率与所述第一预设阈值进行比对,以判断是否对所述新生代进行回收。

终端将所述第一使用率与所述第一预设阈值进行比对,其中,第一预设阈值是指预先设置的新生代回收的临界值,例如,第一预设阈值可以设置为70%,终端根据第一使用率与所述第一预设阈值的比对结果,判断是否对所述新生代进行回收;若所述第一使用率超过所述第一预设阈值,则进行java虚拟机垃圾回收,若所述第一使用率不超过所述第一预设阈值,则不进行java虚拟机垃圾回收。

步骤s42,若所述第一使用率超过所述第一预设阈值,则将所述可达对象复制至目标存储空间

若终端根据比对结果,得到所述第一使用率超过所述第一预设阈值,则获取所述新生代对应的第一回收策略,即,终端需要对新生代中的内存进行回收,终端获取新生代的回收策略,终端将可达对象复制至目标存储空间。

步骤s43,删除所述新生代内存中除所述目标存储空间之外的空间,以进行所述java虚拟机的垃圾回收。

终端删除所述新生代中除所述目标存储空间之外的空间,终端保留目标存储空间中的可达对象,以进行所述java虚拟机的垃圾回收。

在本实施例中给出了一种针对新生代的垃圾回收策略,终端对新生代中的可达对象进行复制,并将不可达对象进行删除,既保证了终端垃圾回收的时效性,实现合理的java虚拟机的垃圾回收。

实现方式二:针对老年代的垃圾回收,具体地:

步骤s44,将所述第二使用率与所述第二预设阈值进行比对,以判断是否对所述老年代进行回收;

终端将所述第二使用率与所述第二预设阈值进行比对,其中,第二预设阈值是指预先设置的老年代回收的临界值,例如,第二预设阈值可以设置为90%,终端根据第二使用率与所述第二预设阈值的比对结果,判断是否对所述老年代进行回收;若所述第二使用率超过所述第二预设阈值,则进行java虚拟机老年代垃圾回收,若所述第二使用率不超过所述第二预设阈值,则不进行java虚拟机老年代垃圾回收。

步骤s45,若所述第二使用率超过所述第二预设阈值,则获取所述老年代对应的第二回收策略。

终端根据比对结果,得到所述第二使用率超过所述第二预设阈值,则获取所述老年代对应的第二回收策略,其中,第二回收策略是指老年代对应的回收策略。

步骤s46,按所述第二回收策略发送暂停请求,在检测到当前运行线程全部暂停后,并创建一个进程进行垃圾回收。

终端按所述第二回收策略发送暂停请求,即,老年代中的对象影响各个业务数据的处理,为了避免老年代回收导致当前业务数据处理错误的情况,终端首先按照第二回收策略发送暂停请求,例如,终端发送sun指令将当前运行的线程“stoptheworld”,在检测到当前运行线程全部暂停后,并创建一个进程进行垃圾回收。即终端利用创建的线程进行快速地老年代垃圾回收。

在本实施例中对老年代中的垃圾进行回收时,为了防止线程突然中断对业务数据处理的影响,可以进行当前运行线程中暂停,并快速地对老年代进行垃圾回收。

此外,参考图3,本发明实施例还提出java虚拟机的垃圾回收装置,所述java虚拟机的垃圾回收装置包括:

扫描模块10,用于通过预设垃圾回收器扫描java虚拟机的内存,得到所述java虚拟机的内存分区信息;

算法获取模块20,用于根据所述内存分区信息将所述java虚拟机的内存划分新生代和老年代,从预设分代算法库中获取与所述内存分区信息匹配的目标分代算法;

使用率确定模块30,用于按所述目标分代算法处理所述新生代和所述老年代,统计处理完成后所述新生代的第一使用率和所述老年代的第二使用率;

回收模块40,用于根据所述第一使用率和/或所述第二使用率确定回收策略,并按所述回收策略进行垃圾回收。

可选地,所述算法获取模块20,包括:

第一确定单元,用于获取所述内存分区信息中的堆栈设置信息,并将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代;

获取比对单元,用于获取所述内存分区信息中的存储数据,并将所述存储数据与预设分类表进行比对,得到所述内存分区信息对应的类型属性;

算法确定单元,用于从预设分代算法库中获取与所述类型属性匹配的预设分代算法,并将所述预设分代算法作为目标分代算法。

可选地,所述算法获取模块20,包括:

第二确定单元,用于获取所述内存分区信息中的堆栈设置信息,并将所述java虚拟机的内存按所述堆栈设置信息划分为新生代和老年代;

输入处理单元,用于将所述内存分区信息输入至预设算法选择模型,通过所述预设算法选择模型处理所述内存分区信息,得到所述内存分区信息对应的处理指标;

算法选择单元,用于从预设分代算法库中获取与所述处理指标匹配的预设分代算法,并将所述预设分代算法作为目标分代算法。

可选地,所述使用率确定模块30,包括:

获取处理单元,用于获取所述内存分代算法中的对象处理方法,并按所述对象处理方法处理所述新生代中所有可达对象;

内存确定单元,用于在检测到所述新生代中的各所述可达对象处理完成后,获取所述新生代第一已使用内存和第一总内存,及所述老年代的第二已使用内存和第二总内存;

使用率确定单元,用于将所述第一已使用内存和第一总内存的比值作为所述新生代的第一使用率,将所述第二已使用内存和第二总内存的比值作为所述老年代的第二使用率。

可选地,所述获取处理单元,还用于:

将各所述可达对象添加至所述新生代中的survivor区,并确定所述survivor区的当前使用率;

将所述当前使用率与预设使用率进行比较;

若所述当前使用率超过预设使用率,则统计所述survivor区中各所述可达对象标记次数;

将所述标记次数超过预设标记次数的所述可达对象作为目标可达对象,并将所述目标可达对象添加至所述老年代中。

可选地,所述回收模块40,包括:

第一比对单元,用于将所述第一使用率与所述第一预设阈值进行比对,以判断是否对所述新生代进行回收;

复制单元,用于若所述第一使用率超过所述第一预设阈值,则将所述可达对象复制至目标存储空间;

第一回收单元,用于删除所述新生代内存中除所述目标存储空间之外的空间,以进行所述java虚拟机的垃圾回收。

可选地,所述回收模块40,还包括:

第二比对单元,用于将所述第二使用率与所述第二预设阈值进行比对,以判断是否对所述老年代进行回收;

策略确定单元,用于若所述第二使用率超过所述第二预设阈值,则获取所述老年代对应的第二回收策略;

第二回收单元,用于按所述第二回收策略发送暂停请求,在检测到当前运行线程全部暂停后,并创建一个进程进行垃圾回收。

其中,java虚拟机的垃圾回收装置的各个功能模块实现的步骤可参照本发明java虚拟机的垃圾回收方法的各个实施例,此处不再赘述。

此外,本发明实施例还提出一种计算机存储介质。

所述计算机存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述实施例提供的java虚拟机的垃圾回收方法中的操作。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体/操作/对象与另一个实体/操作/对象区分开来,而不一定要求或者暗示这些实体/操作/对象之间存在任何这种实际的关系或者顺序;术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。

对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的。可以根据实际的需要选择中的部分或者全部模块来实现本发明方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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