Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java并发性:对它们进行垃圾收集是否需要取消未来?_Java_Garbage Collection_Future - Fatal编程技术网

Java并发性:对它们进行垃圾收集是否需要取消未来?

Java并发性:对它们进行垃圾收集是否需要取消未来?,java,garbage-collection,future,Java,Garbage Collection,Future,我正在编写一些代码,其中可能需要创建数量无限的未来对象(java.util.concurrent.future) 但我担心在某个时候内存会耗尽 这里有几个问题: jvm是否知道,一旦将来完成,它就不会在任何地方被引用,因此有资格使用GC(即使创建它的线程仍然处于活动状态并正在运行) 理想情况下,我不想自己跟踪这些未来。但是,如果我保留这些期货的参考资料,并定期调用cancel来取消它们,这会使它们可用于GC吗 您最终需要删除对未来的任何引用,以便对它们进行垃圾收集。通常的做法是维护未来的集合,并

我正在编写一些代码,其中可能需要创建数量无限的未来对象(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()
    方法。