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

【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里。

相关文章:

  • 2. PyQGIS Windows下开发环境搭建
  • 【JAVA基础】什么情况下可以直接使用类名.方法名调用方法?
  • 降低诊断消息转发延迟与缓冲区内存占用优化方案
  • 高等数学-微分
  • ganache-ui使用
  • HashMap的基础用法(java)
  • 系统性能分析基本概念(5) : 何时开始性能分析
  • Any类(C++17类型擦除,也称上帝类)
  • 【Java多线程】JUC其他常用组件
  • 系统架构设计(十八):ATAM
  • Linux的启动流程
  • Win11怎样禁止程序开机启动
  • vue3项目动态路由的相关配置踩坑记录
  • 每日算法 -【Swift 算法】Z 字形变换(Zigzag Conversion)详解与实现
  • 第二十章 TIM——基本定时器
  • Javascript 学习
  • leetcode2947. 统计美丽子字符串 I-medium
  • AGI大模型(32):LangChain实现RAG
  • 探秘 C++ 计数器类:从基础实现到高级应用
  • (Git) 稀疏检出(Sparse Checkout) 拉取指定文件
  • 做网站显示上次登录时间代码/中国新闻社
  • 怎样创建网站吉洋大鼓/北京网站优化快速排名
  • 淘宝运营培训班多少钱/seo排名工具哪个好
  • 网站改版 百度影响/谁有恶意点击软件
  • 石家庄做外贸的网站推广/北京网站优化方式
  • 学校校园网站建设方案/厦门seo排名优化方式