如何确保提交到 ThreadPoolExecutor 然后取消的 FutureTask 的垃圾回收?

2023-11-24

我正在提交Callable对象到ThreadPoolExecutor他们似乎一直留在记忆中。

使用 Eclipse 的 MAT 工具查看堆转储,可以看到Callable对象正在被引用FutureTask$Sync's callable多变的。那FutureTask$Sync被引用为FutureTask's sync多变的。那FutureTask被引用的是FutureTask$Sync's this$0多变的。

我读过有关此的内容(here, here,以及关于SO),看起来像FutureTask可调用对象被包装在ThreadPoolExecutor的submit() 永远保存对可调用对象的引用。

我感到困惑的是如何确保FutureTask收集垃圾,以便它不会继续将可调用对象保留在内存中,并保留可调用对象可能在内存中保存的任何内容?

只是为了提供有关我的特殊情况的更多详细信息,我正在尝试实施ThreadPoolExecutor允许在需要时取消所有已提交的任务。我尝试了在 SO 和其他地方找到的几种不同的方法,例如完全关闭执行器(使用shutdown(), shutdownNow()等)并保存期货收益清单submit()并对所有这些调用取消,然后清除期货列表。理想情况下,我希望不必将其关闭,而只是cancel()并在需要时清除。

所有这些方法似乎都没有什么作用。如果我向池中提交一个可调用对象,它很可能最终会保留下来。

我究竟做错了什么?

Thanks.

Edit:

根据要求,这里是 ThreadPoolExecutor 的构造函数。

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
    super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}

经过进一步测试,我可以看到,如果我让已提交给 ThreadPoolExecutor 的任务完成,则不会出现泄漏。如果我尝试以任何方式取消它们,例如:

shutdownNow()

或者保存对未来的引用并稍后调用取消:

Future referenceToCancelLater = submit(task);
...
referenceToCancelLater.cancel(false);

或者通过使用以下方法将它们从队列中删除:

getQueue.drainTo(someList)

or

getQueue.clear()

或者 循环保存对 future 的引用并调用:

getQueue.remove(task)

任何一种情况都会导致 FutureTask 如上所述保留下来。

因此,所有这一切的真正问题是如何正确地从 ThreadPoolExecutor 中取消或删除项目,以便 FutureTask 被垃圾收集并且不会永远泄漏?


根据这个帖子,你可以打电话purge在执行者身上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确保提交到 ThreadPoolExecutor 然后取消的 FutureTask 的垃圾回收? 的相关文章

  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • 我如何在简单的 php 函数中使用“依赖注入”,我应该打扰吗?

    我一直听到人们谈论依赖注入及其好处 但我并不真正理解它 我想知道这是否是 我始终将数据库连接作为参数传递 问题的解决方案 我尝试阅读维基百科的条目 但该示例是用 Java 编写的 因此我不太清楚它试图阐明的差异 http en wikipe
  • 使用 Win32 处理 Ctrl+C

    I have a Win32 window message loop I want to intercept Copy to clipboard via CTRL C My current approach is to handle it
  • symfony2 文件因表单错误而丢失

    我正在使用与学说相关的文件上传的标准实现 按照 symfony2 网站教程上的示例 当我的上传表单在验证中遇到错误 并将用户发送回带有错误消息的表单时 它会丢失选择上传的文件 尽管如果我 var dump 我的 entity gt file
  • 如何使用正则表达式替换字符串中的最后一个点?

    我正在尝试使用正则表达式替换字符串中的最后一个点 假设我有以下字符串 String string hello world how are you 我想用感叹号替换最后一个点 结果是 hello world how are you 我使用该方
  • 带有自定义 ArrayAdapter 的微调器,适用于不显示所选项目的对象

    我有一个自定义 ArrayAdapter 来表示微调器控件上的对象 我可以加载我的项目 列表并显示它以供选择 但是当实际选择发生时 微调器什么也不显示 活动代码 public MetroData metroData private Spin
  • 为什么某些项目在 Spy++ 的 Windows 视图中呈灰色?

    要修改另一个程序的窗口 我需要找到一个特定的SysTreeView32在其中使用EnumChildWindowsAPI 调用 当我使用 Spy 检查窗口时 有很多SysTreeView32位于其中 但除了我正在寻找的一个之外 所有其他都呈灰
  • Rails:无法提交通过 Ajax 加载的远程表单

    Goal 我有一个包含来自 Rails 后端的项目列表的页面 我希望能够通过 Rails UJS 使用 Ajax 调用来编辑该列表中的一行 Approach 我在每行的末尾添加了一个编辑按钮 编辑按钮是一个link to remote gt
  • 生成随机加权值

    Edit 我重写了这个问题 希望目标更清晰一些 这是这个问题的扩展问题here 我真的很喜欢中提供的功能这个答案 在上面的答案中 我们可以设置达到极限的概率 较高的数字产生较高的概率获得较低的数字 反之亦然 问题是我必须设置 3 组的概率
  • 如何在 Perl 中创建哈希的哈希?

    根据我目前对 Perl 中哈希值的理解 我希望这段代码能够打印 hello world 它什么也不打印 a b b str hello a 1 b b b str world a 2 b print a 1 str a 2 str 我假设哈
  • 如何在Eclipse中设置SplashScreen?

    我的应用程序会在启动主窗口之前加载启动屏幕 如何设置 Eclipse 中运行的启动屏幕 NetBeans 中有一个位置可以放置 splash splashScreen png 以便应用程序可以从 SplashScreen 启动 Eclips
  • 在页面中央显示图像

    我有一个图像 加载图像 我希望该图像显示在页面的中心 我怎样才能做到这一点 我写的代码是 img loading position absolute left 0px top 0px z index 1 如何让该图片始终显示在页面中央 发现
  • TypeScript 编译器对 let 的计算方式与 const 不同

    以下是鲍里斯 切尔尼 Boris Cherny 的第 64 页编程 TypeScript 考虑这样的 JavaScript 函数 function warnUser warning if warnUser wasCalled return
  • 如何使用Android的CacheManager?

    我目前正在开发一个使用 http 请求获取图像的 Android 应用程序 如果我可以缓存这些图像以提高性能和带宽使用 那就太好了 我在 Android 参考中遇到了 CacheManager 类 但我真的不知道如何使用它 也不知道它的真正
  • 在Python中创建一个具有最大长度的空双端队列?

    我正在查看 Python 双端队列的文档 看起来构造函数是deque iterable maxlen 是否没有办法创建一个具有最大长度的空双端队列 即 不指定可迭代对象 您可以直接提供列表文字 因此不必在单独的行上声明任何内容 gt gt
  • 按任意时间间隔对 DateTime 进行分组

    我有一个项目类的 IEnumerable 定义如下 public class Item public DateTime Date get private set public decimal Value get private set pu
  • WPF:将虚拟文件拖放到 Windows 资源管理器中

    我正在开发一个类似于 dropbox 的应用程序 并在 WPF 列表视图上显示远程文件 我想将这些元素拖放到 Windows 资源管理器中 我见过这样的代码 var dataObject new DataObject DataFormats
  • 在 Windows 8.1 中运行 Visual Studio 6 C++

    我最近将系统迁移到 Windows 8 1 不幸的是 像其他人一样 我无法再启动 Visual Studio 6 软件在启动时崩溃 闪屏 我知道有一些解决方法 可以在较新的 IDE 中使用 vc6 进行编译 但这对我不起作用 因为我必须编译
  • IIS Express 为每个请求加载和卸载模块

    我们有一个 ASP NET 项目在调试时使用 IIS Express 启动VS2013 然后加载解决方案 构建解决方案并在调试模式下启动Web应用程序后 输出窗口列出了一堆已加载和卸载的DLL 经过一番搜索后 我发现 IIS Express
  • Redis 是单线程的。那我为什么要用生菜呢?

    Redis 4 0之后 Redis可以多线程执行一些功能 1 删除后台对象等 但Redis通常仍然使用单线程 常见问题解答 Redis 所以我觉得生菜没什么用 Lettuce 是 Redis 客户端 可以在 1 个连接中使用多个线程 但 R
  • 如何确保提交到 ThreadPoolExecutor 然后取消的 FutureTask 的垃圾回收?

    我正在提交Callable对象到ThreadPoolExecutor他们似乎一直留在记忆中 使用 Eclipse 的 MAT 工具查看堆转储 可以看到Callable对象正在被引用FutureTask Sync s callable多变的