Ho riscontrato questo problema nel mio progetto di vita reale e dimostrato dal codice di test e dal profiler. Invece di incollare il codice "tl; dr", ti sto mostrando una foto e poi la descrivo. Informazioni sul meccanismo Future.firstCompletedOf e Garbage Collect
In poche parole, sto usando Future.firstCompletedOf
per ottenere un risultato da 2 Future
s, entrambi i quali non hanno cose in comune e non si preoccupano gli uni degli altri. Anche se, quale è la domanda che voglio risolvere, il Garbage Collector non può riciclare il primo oggetto Result
fino a quando entrambi i Future
sono finiti.
Quindi sono davvero curioso del meccanismo alla base di questo. Qualcuno potrebbe spiegarlo da un livello più basso, o fornire qualche suggerimento per me da esaminare.
Grazie!
PS: è perché condividono lo stesso ExecutionContext
?
** Aggiornamento ** codice di prova incolla come richiesto
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)
}
}
Sono curioso di sapere come sei riuscito a dimostrare che "risultato" non può essere considerato come garbage collector perché direi il contrario, potrebbe essere interessante.Forse aggiungere ulteriori dettagli su come hai verificato questo? –
Mostra il codice. È praticamente impossibile dire cosa potrebbe accadere senza di esso. –
In realtà, il problema è generale e non dipende da un caso d'uso specifico, quindi è molto possibile rispondere senza ulteriori dettagli. –