【问题标题】:CompletableFuture and Garbage CollectionCompletableFuture 和垃圾收集
【发布时间】:2019-02-15 17:29:19
【问题描述】:

我想触发许多一次性异步 CompletableFuture,如下所示:

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

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

【问题讨论】:

  • 在标记阶段,所有可从 Java 线程、本机句柄和其他根源访问的对象都被标记为活动的,以及可从这些对象访问的对象等等。此过程识别并标记所有仍在使用的对象,其余的可以视为垃圾。

标签: java asynchronous garbage-collection completable-future


【解决方案1】:

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

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

你很安全。

【讨论】:

  • 我检查了supplyAsync 的来源,并且可以确认提交给 Executor 的 AsyncSupply 可运行对象包含对 CompletableFuture 的引用。
  • 或者简而言之,垃圾收集器不会改变程序的语义;完成是如何实现的并不重要,因为它已经以一种会发生的方式实现,因此它会发生,而垃圾收集器不会改变它。
猜你喜欢
  • 2012-03-21
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
相关资源
最近更新 更多