Java并发性:对它们进行垃圾收集是否需要取消未来?
我正在编写一些代码,其中可能需要创建数量无限的未来对象(java.util.concurrent.future) 但我担心在某个时候内存会耗尽 这里有几个问题:Java并发性:对它们进行垃圾收集是否需要取消未来?,java,garbage-collection,future,Java,Garbage Collection,Future,我正在编写一些代码,其中可能需要创建数量无限的未来对象(java.util.concurrent.future) 但我担心在某个时候内存会耗尽 这里有几个问题: jvm是否知道,一旦将来完成,它就不会在任何地方被引用,因此有资格使用GC(即使创建它的线程仍然处于活动状态并正在运行) 理想情况下,我不想自己跟踪这些未来。但是,如果我保留这些期货的参考资料,并定期调用cancel来取消它们,这会使它们可用于GC吗 您最终需要删除对未来的任何引用,以便对它们进行垃圾收集。通常的做法是维护未来的集合,并
您最终需要删除对
未来的任何引用,以便对它们进行垃圾收集。通常的做法是维护未来的集合,并定期检查isDone()
是否返回true
。如果是,则任务已完成,对它的引用可能会被清除。如果您担心堆积一些可能会被安全中断的长时间运行的任务,您需要在未来
上调用cancel()
,并删除/取消对它可能存在的任何引用
一般来说,构建一个可能经历无限增长的系统总是一个坏主意。如果未完成的未来
对象数量过大,则应在系统中的其他位置施加背压
不一定是“一旦未来完成,它就不会在任何地方被引用。”例如,引用它的客户端可以在任何时候通过get()
方法请求结果。因此,JVM需要保持未来
处于活动状态,直到删除所有这些外部引用。线程池中的引用将在Future
被“done”(表示它完成了任务或被取消)时被删除 你们看到这个问题了吗
一旦未来的计算完成,你就不能再取消它了。
我不知道确切的上下文,但一个建议是跟踪未来,取消你想要或需要取消的,并调用执行者清除,将其从工作队列中删除
希望有帮助。谢谢!ExecutorService被传递给我的代码,我通过调用ExecutorService上的submit()
来创建未来。该Executor服务将继续保留对期货的引用,即使在期货完成时也是如此。我认为没有办法告诉executorService清除已完成的未来:(executorService
不会保留通过submit()提交的任务的引用)
一旦完成。只有在运行程序的其他地方提到了未来的时候,你才需要关心这个问题。谢谢@andrew bissell!没问题。如果答案解决了你的问题,请记住接受带有复选标记的答案。:)谢谢你指出这一点。但是,我使用的是executorService,而不是ThreadPoolExecutor。ExecutorService似乎没有purge()
方法。