一种内存回收方法、装置、电子设备及存储介质制造方法及图纸

技术编号:32032631 阅读:12 留言:0更新日期:2022-01-27 13:11
本发明专利技术实施例提供了一种内存回收方法、装置、电子设备及存储介质,可以针对每一DirectByteBuffer对象,通过该DirectByteBuffer对象对应的计数器,记录该DirectByteBuffer对象的标记数值;标记数值表示当前针对该DirectByteBuffer对象的有效引用的数目;判断该DirectByteBuffer对象当前的标记数值是否为零;如果该DirectByteBuffer对象当前的标记数值为零,对该DirectByteBuffer对象引用的堆外内存进行回收。基于上述处理,可以在一定程度上避免堆外内存资源浪费,提高堆外内存的利用率。堆外内存的利用率。堆外内存的利用率。

【技术实现步骤摘要】
一种内存回收方法、装置、电子设备及存储介质


[0001]本专利技术涉及计算机
,特别是涉及一种内存回收方法、装置、电子设备及存储介质。

技术介绍

[0002]堆内内存是指把Java(一种面向对象的计算机语言)程序中的对象分配在JVM(Java Virtual Machine,Java虚拟机)的堆以内的内存,堆内内存由JVM的垃圾回收线程管理。堆外内存是指把Java程序中的对象分配在JVM的堆以外的内存,堆外内存由操作系统管理。Java程序在运行时,可能需要将一些较大的数据存储至堆外内存,可以通过堆内内存中的DirectByteBuffer(直接内存缓冲器)对象引用较大的堆外内存,用于存储数据。
[0003]为了提高内存利用率,针对堆内内存中的每一内存块,当该内存块的占用率达到预设阈值时,触发JVM的垃圾回收线程。针对该内存块中的每一DirectByteBuffer对象,当通过垃圾回收线程确定不存在从GC ROOT(自动内存管理)对象至该DirectByteBuffer对象的引用链时,表示不存在其他对象使用该DirectByteBuffer对象引用的堆外内存中的数据,则对该DirectByteBuffer对象占用的堆内内存进行回收,并触发该DirectByteBuffer对象对应的run方法,以对该DirectByteBuffer对象引用的堆外内存进行回收。后续,其他对象可以使用已经回收的堆外内存。
[0004]然而,如果堆内内存中的一个内存块的占用率未达到预设阈值时,即使不存在从GC ROOT对象至该DirectByteBuffer对象的引用链,也不会触发垃圾回收线程对该内存块中的DirectByteBuffer对象占用的堆内内存进行回收,则不会触发DirectByteBuffer对象的run方法,导致该内存块中的DirectByteBuffer对象引用的堆外内存无法被回收。也就是说,即使DirectByteBuffer对象引用的堆外内存中存储了无用数据,其他对象也无法使用该堆外内存,导致堆外内存资源浪费,堆外内存的利用率较低。

技术实现思路

[0005]本专利技术实施例的目的在于提供一种内存回收方法、装置、电子设备及存储介质,以在一定程度上避免堆外内存资源浪费,提高堆外内存的利用率。具体技术方案如下:
[0006]第一方面,为了达到上述目的,本专利技术实施例提供了一种内存回收方法,所述方法包括:
[0007]针对每一DirectByteBuffer对象,通过该DirectByteBuffer对象对应的计数器,记录该DirectByteBuffer对象的标记数值;其中,所述标记数值表示当前针对该DirectByteBuffer对象的有效引用的数目;
[0008]判断该DirectByteBuffer对象当前的标记数值是否为零;
[0009]如果该DirectByteBuffer对象当前的标记数值为零,对该DirectByteBuffer对象引用的堆外内存进行回收。
[0010]可选的,所述通过该DirectByteBuffer对象对应的计数器,记录该
DirectByteBuffer对象的标记数值,包括:
[0011]当检测到该DirectByteBuffer对象被新的对象引用时,将该DirectByteBuffer对象对应的计数器记录的标记数值加一;
[0012]确定当前引用该DirectByteBuffer对象的其他对象,作为目标对象;
[0013]针对每一目标对象,当该目标对象对该DirectByteBuffer对象的引用失效时,将该DirectByteBuffer对象对应的计数器记录的标记数值减一。
[0014]可选的,在所述针对每一目标对象,当该目标对象对该DirectByteBuffer对象的引用失效时,将该DirectByteBuffer对象对应的计数器记录的标记数值减一之前,所述方法还包括:
[0015]针对每一目标对象,当该目标对象引用该DirectByteBuffer对象的方法执行结束时,确定该目标对象对该DirectByteBuffer对象的引用失效。
[0016]可选的,所述判断该DirectByteBuffer对象当前的标记数值是否为零,包括:
[0017]当达到预设周期时,判断该DirectByteBuffer对象当前的标记数值是否为零;
[0018]或者,
[0019]当该DirectByteBuffer对象的标记数值减小时,判断该DirectByteBuffer对象减小后的标记数值是否为零。
[0020]可选的,在所述对该DirectByteBuffer对象引用的堆外内存进行回收之前,所述方法还包括:
[0021]将该DirectByteBuffer对象占用的堆内内存标记为可用状态;
[0022]所述对该DirectByteBuffer对象引用的堆外内存进行回收,包括:
[0023]调用该DirectByteBuffer对象对应的run方法,以将该DirectByteBuffer对象引用的堆外内存标记为可用状态。
[0024]第二方面,为了达到上述目的,本专利技术实施例提供了一种内存回收装置,所述装置包括:
[0025]记录模块,用于针对每一DirectByteBuffer对象,通过该DirectByteBuffer对象对应的计数器,记录该DirectByteBuffer对象的标记数值;其中,所述标记数值表示当前针对该DirectByteBuffer对象的有效引用的数目;
[0026]判断模块,用于判断该DirectByteBuffer对象当前的标记数值是否为零;
[0027]第一回收模块,用于如果该DirectByteBuffer对象当前的标记数值为零,对该DirectByteBuffer对象引用的堆外内存进行回收。
[0028]可选的,所述记录模块,具体用于当检测到该DirectByteBuffer对象被新的对象引用时,将该DirectByteBuffer对象对应的计数器记录的标记数值加一;
[0029]确定当前引用该DirectByteBuffer对象的其他对象,作为目标对象;
[0030]针对每一目标对象,当该目标对象对该DirectByteBuffer对象的引用失效时,将该DirectByteBuffer对象对应的计数器记录的标记数值减一。
[0031]可选的,所述记录模块,还用于在执行所述针对每一目标对象,当该目标对象对该DirectByteBuffer对象的引用失效时,将该DirectByteBuffer对象对应的计数器记录的标记数值减一之前,执行针对每一目标对象,当该目标对象引用该DirectByteBuffer对象的方法执行结束时,确定该目标对象对该DirectByteBuffer对象的引用失效。
[0032]可选的,所述判断模块,具体用于当达到预设周期时,本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种内存回收方法,其特征在于,所述方法包括:针对每一DirectByteBuffer对象,通过该DirectByteBuffer对象对应的计数器,记录该DirectByteBuffer对象的标记数值;其中,所述标记数值表示当前针对该DirectByteBuffer对象的有效引用的数目;判断该DirectByteBuffer对象当前的标记数值是否为零;如果该DirectByteBuffer对象当前的标记数值为零,对该DirectByteBuffer对象引用的堆外内存进行回收。2.根据权利要求1所述的方法,其特征在于,所述通过该DirectByteBuffer对象对应的计数器,记录该DirectByteBuffer对象的标记数值,包括:当检测到该DirectByteBuffer对象被新的对象引用时,将该DirectByteBuffer对象对应的计数器记录的标记数值加一;确定当前引用该DirectByteBuffer对象的其他对象,作为目标对象;针对每一目标对象,当该目标对象对该DirectByteBuffer对象的引用失效时,将该DirectByteBuffer对象对应的计数器记录的标记数值减一。3.根据权利要求2所述的方法,其特征在于,在所述针对每一目标对象,当该目标对象对该DirectByteBuffer对象的引用失效时,将该DirectByteBuffer对象对应的计数器记录的标记数值减一之前,所述方法还包括:针对每一目标对象,当该目标对象引用该DirectByteBuffer对象的方法执行结束时,确定该目标对象对该DirectByteBuffer对象的引用失效。4.根据权利要求2所述的方法,其特征在于,所述判断该DirectByteBuffer对象当前的标记数值是否为零,包括:当达到预设周期时,判断该DirectByteBuffer对象当前的标记数值是否为零;或者,当该DirectByteBuffer对象的标记数值减小时,判断该DirectByteBuffer对象减小后的标记数值是否为零。5.根据权利要求1所述的方法,其特征在于,在所述对该DirectByteBuffer对象引用的堆外内存进行回收之前,所述方法还包括:将该DirectByteBuffer对象占用的堆内内存标记为可用状态;所述对该DirectByteBuffer对象引用的...

【专利技术属性】
技术研发人员:张松
申请(专利权)人:上海绚显科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1