2010-10-18 5 views

risposta

10

Il GC pulirà automaticamente tutte le variabili che non sono più in ambito.

Una variabile dichiarata all'interno di un blocco, ad esempio un ciclo for, sarà solo nell'ambito di tale blocco. Una volta che il codice è uscito dal blocco, il GC lo rimuoverà. Ciò accade non appena termina l'iterazione del ciclo, quindi l'elenco diventa idoneo per la garbage collection non appena termina ogni iterazione del ciclo.

L'ambito di una variabile è anche il motivo per cui i non sarebbe valido dopo il ciclo di esempio.

Si noti che questo è il caso solo se si utilizza la variabile solo all'interno del ciclo. Se lo passi ad un altro metodo che mantiene un riferimento ad esso, la tua variabile non sarà raccolta.

+0

Penso che sia più preoccupato che gli oggetti assegnati a 'myList' nelle precedenti iterazioni del ciclo sarà GC, anche se ancora nel ciclo. Non dopo il ciclo. –

+0

Buon punto, ho aggiornato la risposta per risolverlo. –

+1

Non so se questa risposta è abbastanza completa. Per prima cosa, gli interi e altri tipi di valori sono allocati nello stack e non hanno nulla a che fare con la garbage collection. In secondo luogo, myList potrebbe non essere idonea per la garbage collection; dipende dal fatto che un altro riferimento sia memorizzato o meno da qualche altra parte nel codice. –

6

Signore, no! Java GC è molto, molto, molto più intelligente di quello.

+0

Bene, se il risultato di 'buildList()' sovrascrive 'finalize()' sarà disastroso. Ma speriamo che il codice sia sano. –

+0

@ Martin: come mai? –

+0

Gli oggetti che eseguono l'override di finalize() ricevono un trattamento molto speciale da parte del garbage collector. –

0

non devi preoccuparti della spazzatura. Java GC lo farà automaticamente. Ma il mio suggerimento è che come un buon sviluppatore, devi fare pratica per liberare la spazzatura. Come GC ci vorrà un po 'di tempo. Quindi, prendendosi cura di noi stessi aumenteremo sicuramente le prestazioni.

3

Il GC recupera tutte le istanze irraggiungibili, quando mai lo desidera. Non ha variabili GC.

Le variabili i e myList vivono in pila. Quando termina il ciclo for (quando escono dal campo di applicazione), verranno espulsi dallo stack e quindi recuperati dalla memoria. Le variabili saranno quindi scomparse. L'impostazione della variabile di riferimento myList su null appena prima della sua scomparsa, non fa alcuna differenza (per GCing delle istanze). Se GC reclamerà la memoria per l'istanza myList riferita, in realtà dipende dal fatto che si abbia un altro riferimento alla stessa istanza.

Le variabili non ricevono GCed, le istanze lo fanno.

+0

+1 per "Le variabili non ricevono GCed, le istanze" – Eugene

3

Probabilmente sarebbe utile capire la sintassi dietro il ciclo for. Questo è discusso nel JLS Section 14.14.1.

BasicForStatement: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement 

... 

Statement: 
    StatementWithoutTrailingSubstatement 
    ... 

StatementWithoutTrailingSubstatement: 
    Block 
    EmptyStatement 
    ExpressionStatement 
    ... 


Block: 
    { BlockStatementsopt } 

BlockStatements: 
    BlockStatement 
    BlockStatements BlockStatement 

BlockStatement: 
    LocalVariableDeclarationStatement 
    ClassDeclaration 
    Statement 

Normativa, come sempre, può essere una singola istruzione o un blocco (istruzioni delimitate con parentesi graffe). Un blocco rappresenta un nuovo ambito lessicale e le variabili dichiarate sono locali solo per quel blocco. Quello che molte persone non capiscono è che non è unico per il ciclo. Posso mettere un blocco di istruzioni in qualsiasi punto un metodo:

public void someMethod() { 

    { 
     List<String> myList = new ArrayList<String>(); 
     System.out.println(myList); 
    } 
    System.out.println(myList.size()); //compile error: myList out of scope 
} 

In ogni caso questo non sta andando dove mi intendevo.Basti dire che ha meno a che fare con il fatto che si tratta di un ciclo e che ha più a che fare con il fatto che si tratta di un blocco (se si sceglie di non utilizzare un'istruzione di blocco, non è possibile dichiarare nuove variabili locali in modo che il problema sia irrilevante).

+0

Ciò significa che il GC non viene utilizzato per gestire la memoria per le variabili/istanze dichiarate all'interno di un blocco? Una volta terminato il blocco, le variabili/istanze vengono recuperate automaticamente? – shady

+0

No, non significa quello. Le istanze sono ancora messe sullo heap e recuperate dal gc. Ricorda che il blocco potrebbe facilmente perdere un riferimento a una di queste istanze. Tutto quello che stavo cercando di dire è che l'ambito di una variabile è limitato a un blocco, indipendentemente dalla struttura di controllo utilizzata. –