函数主体是否传递给Future.onComplete()
,并在调用它们之后将其闭包,丢弃和垃圾回收?
我问是因为我正在编写Future
实例的无限制序列。每个Future
都有一个.onComplete { case Failure(t)...}
,它引用了先前Future
中的先前已知有效值。我要避免的是,由于闭包主体中的引用,所有Future
结果的总历史记录一直保存在JVM的内存中。
也许Scala比这更聪明,但是略读与执行上下文和期货相关的代码并不会带来很多收益。
谢谢。
答案 0 :(得分:3)
通常实现Future
且您要查看的类是DefaultPromise
。
它包含可变的状态,该状态会随着Future的完成而更新。
onComplete
并且已经完成,那么它将立即计划您的回调并返回结果。回调未记录在任何地方。onComplete
,则回调将添加到“侦听器”列表中。complete
),然后安排所有侦听器运行该结果,并删除侦听器列表(内部状态更改为“已完成此结果”) “)这意味着您的回调链只会在“上游未来”不完整之前建立。之后,所有问题都会解决并进行垃圾回收。
“侦听器列表”有点简化。需要特别注意的是,这些侦听器不要最终互相引用,特别是要打破引用循环,以防止在递归构造期货时垃圾回收起作用。显然,这在早期版本中确实是一个问题。
通过自动破坏这些承诺链解决了泄漏问题,因此,承诺在长链中不会相互引用。这个 允许每个诺言被单独收集。这个想法是“扁平化” 承诺链,因此不是每个承诺都指向其承诺 邻居,他们直接将承诺指向了 链。这意味着仅引用了根承诺,而所有 如果没有其他承诺,就可以立即进行垃圾回收 不再被用户代码引用。