を収集します。 「tl; dr」コードを貼り付ける代わりに、私はあなたに絵を見せて、それを説明します。簡単に言えば は、私は私の実際のプロジェクトでは、この問題が発生したため、私のテストコードとプロファイラによって証明しましたメカニズム
、私は共有のものを持っていないし、お互いを気にしない、どちらも、2 Future
sから結果を得るためにFuture.firstCompletedOf
を使用しています。私が対処したい質問であっても、Future
の両方が完了するまで、ガベージコレクタは最初のResult
オブジェクトをリサイクルできません。
だから私はこの背後にあるメカニズムについては本当に興味があります。誰かがそれをより低いレベルから説明することができますか、または私が調べるためのヒントを提供することができます。
ありがとうございます!
PS:同じものを共有しているのですか?ExecutionContext
?
def firstCompletedOf[T](futures: TraversableOnce[Future[T]])(implicit executor: ExecutionContext): Future[T] = {
val p = Promise[T]()
val completeFirst: Try[T] => Unit = p tryComplete _
futures foreach { _ onComplete completeFirst }
p.future
}
{ futures foreach { _ onComplete completeFirst }
を行う場合、機能{ _ onComplete completeFirst }
がどこか ExecutionContext.execute
を経由して保存されます。
**更新**ペーストのテストコード要求として
object Main extends App{
println("Test start")
val timeout = 30000
trait Result {
val id: Int
val str = "I'm short"
}
class BigObject(val id: Int) extends Result{
override val str = "really big str"
}
def guardian = Future({
Thread.sleep(timeout)
new Result { val id = 99999 }
})
def worker(i: Int) = Future({
Thread.sleep(100)
new BigObject(i)
})
for (i <- Range(1, 1000)){
println("round " + i)
Thread.sleep(20)
Future.firstCompletedOf(Seq(
guardian,
worker(i)
)).map(r => println("result" + r.id))
}
while (true){
Thread.sleep(2000)
}
}
は、私はあなたが、私は反対のことを言うので、「結果が」ゴミを収集することができないことを証明するために管理方法についての骨董品だ、それは面白いかもしれません。これをどのように確認したかについての詳細を追加することがありますか? –
コードを表示します。それがなければ何が起こっているのかは言うまでもありません。 –
実際、この問題は一般的な問題であり、特定のユースケースに依存しないため、詳細を問わずに答えることができます。 –