Je suis en train de déboguer une fuite de mémoire et j'ai dû plonger dans des internes CompletableFuture. Il y a ce morceau de code (CompletableFuture.uniComposeStage):Expulsion d'objets non intuitive à partir de la récupération de place
CompletableFuture<V> g = f.apply(t).toCompletableFuture();
...
CompletableFuture<V> d = new CompletableFuture<V>();
UniRelay<V> copy = new UniRelay<V>(d, g);
g.push(copy);
copy.tryFire(SYNC);
return d;
Le code lui-même est tout à fait clair pour moi: appliquer une fonction qui retourne CompletionStage (g
), créer un relais qui sera éventuellement des transferts de fonds à un autre CompletableFuture (d
), puis renvoyer cet autre futur (d
). Je vois suivant la situation de référence:
copy
références à la foisd
etg
(et il n'y a pas de magie dans le constructeur, seules les affectations de terrain)g
référencescopy
d
références rien
seulement d
est retourné, donc, en fait, les deux g
et copy
semblent être une méthode interne varia Bles à moi, que (à première vue) ne devrait jamais quitter la méthode et être finalement gc'd. Les deux tests naïfs et le fait qu'il a été écrit il ya longtemps par des développeurs prouvés me suggère que je me trompe et qu'il manque quelque chose. Quelle est la raison pour laquelle ces objets sont omis de la récupération de place?
Ok, j'ai raté l'appel tryFire, mais je ne sais toujours pas ce qui se passe à l'intérieur (et le code est assez difficile à lire), donc les réponses sont toujours très appréciées – Etki
Vous devriez voir quelles références les empêchent d'être GC si vous regarde le tas de tas. – NickL