Java并发:是否取消了收集垃圾所需的期货?

Shr*_*kar 3 java garbage-collection future

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

但我担心某些时候内存不足.

这里有几个问题:

  1. jvm是否知道,一旦未来完成,它就不会在任何地方被引用,因此有资格获得GC(即使创建它的线程仍在运行并运行)?
  2. 理想情况下,我不想自己跟踪这些未来.但是,如果我确实保留这些期货的参考并定期对它们取消取消,那么它们是否可用于GC?

And*_*ell 5

您最终需要删除对Futures的任何引用,以便对它们进行垃圾回收.通常的做法是维护Futures 的集合并定期检查是否isDone()返回true.如果是,则任务已完成,并且可以清除对它的引用.如果你担心堆积如山其中一些可能是安全的中断长时间运行的任务,你需要两个呼叫cancel()Future和删除/空出其可能存在的任何引用.

一般而言,构建一个可能经历无限增长的系统始终是一个坏主意.如果未完成Future对象的数量变得过大,则应在系统中的其他位置应用反压.

不一定是"一旦未来完成,就不会在任何地方被引用".例如,引用它的客户端可以get()在任何时候通过该方法请求结果.因此,JVM需要保持Future活动状态,直到所有这些外部引用都被删除.当Future"完成"(意味着它完成了任务或被取消)时,线程池中的引用将被删除.