Concorrenza Java: è necessario cancellare i Futures necessari affinché siano Garbage Collected?

Sto scrivendo del codice dove potrei aver bisogno di creare un numero illimitato di oggetti futuri (java.util.concurrent.Future).

Ma a un certo punto sono preoccupato di restare senza memoria.

Un paio di domande qui:

  1. Il jvm sa che una volta completato il futuro, non sarà referenziato da nessuna parte e quindi è idoneo per GC (anche se il thread all’interno del quale è stato creato è ancora vivo e funzionante)?
  2. Idealmente, non vorrei tenere traccia di questi futuri stessi. Ma se mantengo il riferimento a questi futuri e periodicamente chiedo l’annullamento, li renderò disponibili per GC?

Dovrai eventualmente rimuovere qualsiasi riferimento alle s Future per poterle raccogliere. La solita pratica è di mantenere una collezione di Future s e controllare periodicamente se isDone() restituisce true . In tal caso, l’attività è stata completata e i relativi riferimenti potrebbero essere eliminati. Se sei preoccupato di accumulare alcune attività di lunga durata che possono essere tranquillamente interrotte, devi chiamare cancel() sul Future e rimuovere / cancel() qualsiasi riferimento ad esso che possa esistere.

In generale, è sempre una ctriggers idea progettare un sistema che possa potenzialmente sperimentare una crescita illimitata. Se il numero di oggetti Future circolazione diventa troppo grande, è necessario applicare una contropressione altrove nel sistema.

Non è necessariamente il caso che “una volta completato il futuro, non viene referenziato da nessuna parte”. Ad esempio, un client con riferimento ad esso potrebbe richiedere il risultato tramite il metodo get() in qualsiasi punto. La JVM deve quindi mantenere in vita il Future finché tutti questi riferimenti esterni non saranno stati rimossi. I riferimenti all’interno del pool di thread verranno rimossi quando il Future verrà “completato” (nel senso che ha completato l’attività o è stato annullato).

Hai visto questa domanda?

Una volta completato il calcolo di un Futuro, non puoi più cancellarlo. Non conosco il contesto esatto, ma un suggerimento sarebbe quello di tenere traccia dei futuri, cancellare quelli che vuoi o dover annullare e chiamare l’eliminazione sull’esecutore per rimuoverli dalla coda di lavoro.

Spero che sia d’aiuto.