gpt4 book ai didi

Java 并发 : Is cancelling Futures necessary for them to be Garbage Collected?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:24 25 4
gpt4 key购买 nike

我正在编写一些代码,我可能需要在其中创建无限数量的 future 对象 (java.util.concurrent.Future)。

但我担心在某些时候会耗尽内存。

这里有几个问题:

  1. jvm 是否知道一旦 future 完成,它就不会在任何地方被引用,因此符合 GC 的条件(即使创建它的线程仍然存在并正在运行)?
  2. 理想情况下,我不想自己跟踪这些 future 。但是,如果我保留这些 futures 的引用并定期对它们调用 cancel,它们是否可以用于 GC?

最佳答案

您最终需要删除所有对 Future 的引用,以便它们被垃圾回收。通常的做法是维护一个 Future 的集合,并定期检查 isDone() 是否返回 true。如果是这样,则任务已完成并且可以清除对它的引用。如果您担心堆积一些可能会被安全中断的长时间运行的任务,您需要在 Future 上调用 cancel() 并删除/清空任何引用它可能存在。

一般来说,构建一个可能经历无限增长的系统总是一个坏主意。如果未完成的 Future 对象的数量增长太大,您应该在系统的其他地方应用背压。

“一旦 future 完成,它就不会在任何地方被引用”并不一定是这样。例如,引用它的客户端可以随时通过 get() 方法请求结果。因此,JVM 需要保持 Future 有效,直到所有这些外部引用都被删除。当 Future “完成”(意味着它完成任务或被取消)时,线程池中的引用将被删除。

关于Java 并发 : Is cancelling Futures necessary for them to be Garbage Collected?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20135304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com