2010-10-18 2 views

Antwort

10

Der GC bereinigt automatisch alle Variablen, die nicht mehr im Gültigkeitsbereich sind.

Eine innerhalb eines Blocks deklarierte Variable, z. B. eine for-Schleife, befindet sich nur innerhalb dieses Blocks. Sobald der Code den Block verlassen hat, wird er vom GC entfernt. Dies geschieht, sobald eine Wiederholung der Schleife endet, sodass die Liste für die Garbage Collection geeignet wird, sobald jede Iteration der Schleife abgeschlossen ist.

Der Gültigkeitsbereich einer Variablen ist auch, warum i nach Ihrer Beispielschleife nicht gültig wäre.

Beachten Sie, dass dies nur der Fall ist, wenn Sie die Variable nur innerhalb der Schleife verwenden. Wenn Sie es an eine andere Methode übergeben, die einen Verweis darauf enthält, wird Ihre Variable nicht als Garbage Collected erfasst.

+0

Ich glaube, er ist mehr besorgt, dass Objekte in vorherigen Iterationen der Schleife zu 'myList' zugewiesen wird GC'd sein, auch wenn noch in der Schleife. Nicht nach der Schleife. –

+0

Guter Punkt, ich aktualisierte die Antwort, um das zu adressieren. –

+1

Ich weiß nicht, ob diese Antwort vollständig genug ist. Zuerst werden Ganzzahlen und andere Werttypen auf dem Stapel zugeordnet und haben nichts mit der Speicherbereinigung zu tun. Zweitens kann myList für die Garbage Collection geeignet sein oder auch nicht. Es hängt davon ab, ob eine andere Referenz irgendwo anders in Ihrem Code gespeichert ist oder nicht. –

6

Herr, nein! Java GC ist viel, viel, viel klüger als das.

+0

Nun, wenn das Ergebnis der 'Buildlist()' 'Überschreibungen finalisieren()' wird es katastrophal sein. Aber lassen Sie uns hoffen, dass der Code gesund ist. –

+0

@Martinho: Wie so? –

+0

Objekte, die finalize() überschreiben, werden vom Garbage Collector sehr speziell behandelt. –

0

müssen Sie sich nicht um den Müll kümmern. Java GC wird dies automatisch tun. Aber mein Vorschlag ist, dass Sie als guter Entwickler Praxis machen müssen, um den Müll zu befreien. Als GC wird einige Verarbeitungszeit benötigt. Indem wir uns um uns kümmern, werden wir die Leistung auf jeden Fall steigern.

3

Der GC ruft alle unerreichbaren Instanzen zurück, wann immer er will. Es gibt keine GC-Variablen.

Die Variablen i und myList leben auf dem Stapel. Wenn die for-Schleife endet (wenn sie den Gültigkeitsbereich verlassen), werden sie vom Stapel geschoben und ihr Speicher wird wiederhergestellt. Die Variablen sind dann weg. Das Festlegen der Referenzvariable myList auf Null, bevor es gerade verschwindet, macht keinen Unterschied (für GCing der Instanzen). Wenn GC den Speicher für die Instanz myList reklamiert, hängt auch davon ab, ob Sie einen anderen Verweis auf die gleiche Instanz haben.

Variablen werden nicht erkannt, Instanzen tun dies.

+0

+1 für „Variablen nicht bekommen GCed, Instanzen tun“ – Eugene

3

Es würde wahrscheinlich helfen, die Syntax hinter der for-Schleife zu verstehen. Das wird in der JLS Section 14.14.1 diskutiert.

BasicForStatement: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement 

... 

Statement: 
    StatementWithoutTrailingSubstatement 
    ... 

StatementWithoutTrailingSubstatement: 
    Block 
    EmptyStatement 
    ExpressionStatement 
    ... 


Block: 
    { BlockStatementsopt } 

BlockStatements: 
    BlockStatement 
    BlockStatements BlockStatement 

BlockStatement: 
    LocalVariableDeclarationStatement 
    ClassDeclaration 
    Statement 

Statement, wie immer, kann eine einzelne Anweisung oder ein Block (Anweisungen mit geschweiften Klammern) sein. Ein Block stellt einen neuen lexikalischen Geltungsbereich dar, und darin deklarierte Variablen sind nur für diesen Block lokal. Was viele Leute nicht wissen, ist das nicht nur für die For-Schleife. Ich kann eine Blockanweisung überall in einer Methode setzen:

public void someMethod() { 

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

Wie auch immer, das geht nicht dahin, wo ich es wollte.Es genügt zu sagen, dass es weniger damit zu tun hat, dass es eine Schleife ist und mehr damit zu tun hat, dass es ein Block ist (wenn Sie keine Blockanweisung verwenden, können Sie keine neuen lokalen Variablen deklarieren, so dass das Problem besteht) irrelevant).

+0

bedeutet dies, dass die GC nicht den Speicher für Variablen/Instanzen verwendet wird, innerhalb eines Blocks deklariert zu verwalten? Sobald der Block beendet ist, werden die Variablen/Instanzen automatisch zurückgewonnen? – shady

+0

Nein, das heißt nicht. Instanzen werden immer noch auf den Haufen gelegt und von der GC zurückgefordert. Denken Sie daran, dass der Block leicht einen Verweis auf eine dieser Instanzen verlieren könnte. Alles, was ich sagen wollte, war, dass der Umfang einer Variablen unabhängig von der verwendeten Kontrollstruktur auf einen Block beschränkt ist. –