Ich habe dieses Problem in meinem realen Projekt angetroffen und durch meinen Testcode und Profiler bewiesen. Anstatt den Code "tl; dr" einzufügen, zeige ich Ihnen ein Bild und beschreibe es dann. Über Future.firstCompletedOf und Garbage Collect-Mechanismus
Einfach gesagt, ich bin mit Future.firstCompletedOf
ein Ergebnis von 2 Future
s zu erhalten, von denen beide haben keine gemeinsamen Dinge und tun umeinander nicht. Auch wenn, was die Frage ist, die ich ansprechen möchte, kann der Garbage Collector das erste Result
Objekt nicht wiederverwenden, bis beide Future
s fertig sind.
Also bin ich wirklich neugierig auf den Mechanismus dahinter. Könnte jemand es von einer niedrigeren Ebene erklären, oder einen Hinweis für mich geben, um mich zu untersuchen.
Danke!
PS: ist es, weil sie das gleiche ExecutionContext
teilen?
** Update ** Paste Testcode als
angefordertobject 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)
}
}
Ich bin neugierig darüber, wie Sie zu beweisen, dass "Ergebnis" kann nicht Müll gesammelt werden, weil ich das Gegenteil sagen würde, könnte es interessant sein.Vielleicht fügen Sie weitere Details hinzu, wie Sie dies verifiziert haben? –
Zeigen Sie den Code. Es ist ziemlich unmöglich zu sagen, was ohne es passieren könnte. –
Eigentlich ist das Problem ein allgemeiner und hängt nicht von einem bestimmten Anwendungsfall ab, daher ist es sehr möglich, ohne weitere Details zu antworten. –