Scala Future '.onComplete' 函数在调用后被丢弃?



函数体是否传递给Future.onComplete(),它们的闭包,丢弃,因此在调用它们后被垃圾回收?

我问是因为我正在编写一个无限的Future实例序列。每个Future都有一个.onComplete { case Failure(t)...},该引用以前Future的已知良好值。我想避免的是,由于闭包主体中的引用,所有Future结果的总历史记录都保留在 JVM 的内存中。

也许 Scala 比这更聪明,但略读与执行上下文和期货相关的代码并没有产生太多收益。

谢谢。

通常实现Future并且要查看的类是DefaultPromise

它包含随着未来完成而更新的可变状态。

  • 如果您调用onComplete并且它已经完成,那么它只会立即安排您的回调并给出结果。回调不会记录在任何地方。
  • 如果在结果尚不可用时调用onComplete,则回调将添加到"侦听器"列表中。
  • 当结果可用时(有人在 promise 上调用complete),则所有侦听器都计划使用该结果运行,并删除侦听器列表(内部状态更改为"已完成并显示此结果")

这意味着您的回调链只会在"上游未来"不完整之前构建。之后,一切都得到解决并收集垃圾。


上面的"听众列表"有点简化。需要特别注意的是,这些侦听器最终不会相互引用,特别是为了打破引用循环,这将阻止垃圾收集在递归构造期货时起作用。显然,这在早期版本中确实是一个问题。

泄漏问题可以通过自动打破这些承诺链来解决,这样承诺就不会在长链中相互引用。这 允许单独收集每个承诺。这个想法是"扁平化" 承诺链,而不是每个承诺都指向其 邻居,他们直接指出承诺的根源 链。这意味着只引用了根承诺,并且所有 其他承诺一旦没有,就可以用于垃圾收集 用户代码引用的时间更长。

最新更新