2012-05-31 17 views
8

Se devo codice simile al seguente:Garbage Collection quando le variabili finali utilizzati nelle classi anonime

public Constructor(final Object o) { 
    taskSystem.add(new CycleTask(15, 15, -1) { 

     @Override 
     public void execute() throws Throwable { 
      //access o here every 15 cycles forever 
     } 
    }); 
} 

Quando sarebbe o essere garbage collection, se mai? Solo quando il compito è stato raccolto, o rimarrà in memoria per sempre perché è definitivo?

risposta

7

opotrebbe ottenere i dati raccolti una volta che non è più raggiungibile, che sia definitiva o meno. Ovviamente, finché execute è in esecuzione, se è necessario accedere a o, impedirà GC.

Quando execute viene eseguito in esecuzione e presupponendo di non aver memorizzato alcun riferimento a o (ad esempio in una raccolta), verrà contrassegnato come pronto per la garbage collection.

2

Non esiste alcuna relazione tra la parola chiave final e la durata della variabile.

Sarà garbage collection quando non è più necessario, e poiché si tratta di un parametro questo può accadere solo al di fuori del metodo (se non vi è alcun riferimento esterno).

La parola chiave final è solo un vincolo dato al compilatore per vietare qualsiasi ulteriore modifica del riferimento o dopo la chiamata della funzione.

+1

Questo non è molto ben espresso. Lo "spazio abitativo" dovrebbe essere "a vita". Ovviamente il chiamante del metodo deve avere un riferimento e l'istanza della classe anonima ne ha un'altra. La parola chiave 'finale' vieta qualsiasi modifica a quella * variabile * dopo l'inizializzazione, * durante * l'esecuzione del metodo, che è il suo intero scopo. – EJP

5

Quando l'istanza di classe anonima diventa idonea per la garbage collection, se nient'altro si riferisce all'oggetto a cui si riferisce o quando è stato chiamato il metodo, quell'oggetto diventerà idoneo per la garbage collection.

Non c'è niente di speciale nelle variabili finali che scoraggia la garbage collection.

2

"final" non ha alcun effetto su GC. L'oggetto diventerà idoneo per la raccolta quando diventa irraggiungibile. In questo caso ci sono almeno tre riferimenti, ognuno dei quali può fermarlo: il parametro 'finale', che scompare quando il metodo restituisce; il riferimento del chiamante; e la copia della variabile finale nell'istanza della classe anonima.