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

时间:2013-11-22 01:29:18

标签: java garbage-collection future

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

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

这里有几个问题:

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

2 个答案:

答案 0 :(得分:5)

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

总的来说,构建一个可能经历无限增长的系统始终是一个坏主意。如果未完成的Future个对象的数量变得太大,您应该在系统的其他位置应用反压力。

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

答案 1 :(得分:0)

您是否看到了this个问题?

一旦完成了Future的计算,您就不能再取消它了。 我不知道确切的上下文,但有一个建议是跟踪期货,取消您想要或需要取消的期货,并在执行人员上调用清除以将其从工作队列中删除。

希望它有所帮助。