未来的垃圾收集

时间:2019-02-15 17:29:20

标签: java asynchronous garbage-collection completable-future

我想触发许多一次性的异步CompletableFuture,例如:

for (Job job : jobs) {
 CompletableFuture.supplyAsync(() -> job.process())
   .whenComplete(this::doSomething);
}

理想情况下,whenComplete完成后可以将这些CompletableFuture进行垃圾回收。但是,由于我没有存储参考文献,因此是否有事先收集它们的风险?

1 个答案:

答案 0 :(得分:4)

您没有显式存储引用,但是supplyAsync在内部。该方法创建一个CompletableFuture并将一个引用返回给它的任务提交到ForkJoinPool(如果您使用的是公共池)。由CompletableFuture返回的whenComplete成为对第一个CompletableFuture的依赖,因此也被引用。

一旦ForkJoinPool完成Supplier的执行,将第一个CompletableFuture标记为完成,触发第二个CompletableFuture,所有这些对象将可用于垃圾回收。执行传递给BiConsumer的{​​{1}}。

您很安全。