当前位置: 首页 > backend >正文

【Java】CompletableFuture.orTimeout在JDK21以下版本有内存泄漏及解决方案

本文介绍CompletableFuture#orTimeout这个API在JDK-21版本以下的导致内存泄漏的bug,并提供两种解决方案。

JDK bug issue链接: https://bugs.openjdk.org/browse/JDK-8303742

这个BUG是在JDK-21中被修复的,也就是说如果你使用的JDK低于21,那么orTimeout这个API是有内存泄漏风险的。

问题描述

CompletableFuture.orTimeout会调度一个延迟任务,用于在超时到期前future还未complete的情况下,通过一个TimeoutException异常来exceptionally complete(API接口)来完成future任务。如果future对象在超时之前完成,则延迟任务将被取消并从延迟的执行器队列中删除。

JDK的这个bug是,只有在future对象non-exceptionally complete时才会发生这种情况,当completed exceptionally时,延迟任务不会被取消,因此其内存会被保留到超时,即使它不再有任何用途。鉴于超时时间应明显长于预期的完成时间,如果经常发生异常完成,这种泄漏是不可忽视的。

问题的根因发生在下面这个代码片段,在源码的CompletableFuture.Canceller.accept里。

http://www.xdnf.cn/news/8278.html

相关文章:

  • 软件设计师“IP协议与子网划分”真题考点分析——求三连
  • Docker安装postgres数据库
  • Vue.js教学第十章:自定义命令的创建使用与应用
  • python——多线程编程(threading)
  • 【工具】Quicker/VBA|PPT 在指定位置添加有颜色的参考线
  • 交叉编译DirectFB报错解决方法
  • Day 28 训练
  • nginx和docker常用指令
  • thinkpad x220降频到0.7Ghz解决办法
  • 遥控器芯片6nm与3nm技术对比!
  • 如何将吉客云奇门数据无缝对接金蝶云星空
  • 远程升级方案(经通讯管理机)
  • 怎么有效降低知网AIGC率?
  • 华为RH1288HV3 BMC忘记用户名密码如何恢复默认
  • 华为仓颉语言如何进行交叉编译
  • 第三十二天打卡
  • 构建基于全面业务数据的大数据与大模型企业护城河战略
  • 【Linux】网络基础3
  • JUC入门(五)
  • 进程、线程和协程切换的比喻
  • 【分治】归并排序:递归版 非递归版
  • IDC机房交换机紧急更换的流程和注意事项
  • torch.gather()和torch.sort
  • 火语言UI组件--控件函数调用
  • 免费开源的图片分割小工具
  • RT-Thread源码阅读(1)——基本框架
  • 通过云服务器实现异地组网 部署WireGuard
  • 【机器学习】 关于外插修正随机梯度方法的数值实验
  • 听脑AI:革新沟通方式,开启高效信息时代
  • 核实发票的真实性与合法性-发票查验接口-虚假发票防范