2012-05-31 7 views
8

Wenn ich Code ähnlich dem folgenden haben:Garbage Collection, wenn endgültige Variablen in anonymen Klassen

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 
     } 
    }); 
} 

Wann möchten o Müll gesammelt werden, wenn überhaupt? Nur wenn die Aufgabe gesammelt wurde, oder wird sie für immer in Erinnerung bleiben, weil sie endgültig ist?

Antwort

7

okönnte bekommen Müll gesammelt, sobald es nicht mehr erreichbar ist, ob es endgültig ist oder nicht. Offensichtlich, solange execute läuft, wenn es auf o zugreifen muss, wird es GC verhindern.

Wenn execute ausgeführt wird, und vorausgesetzt, Sie haben keine Verweise auf o gespeichert (z. B. in einer Sammlung), wird es als bereit für die Garbage Collection gekennzeichnet.

2

Es gibt keine Beziehung zwischen dem Schlüsselwort final und der Lebensdauer der Variablen.

Es wird Müll gesammelt werden, wenn nicht mehr benötigt, und da es ein Parameter ist, kann dies außerhalb der Methode passieren (wenn es keine Referenz außerhalb ist).

Das Schlüsselwort final ist nur eine Einschränkung für den Compiler, die jede weitere Änderung der Referenz o nach dem Aufruf der Funktion zu verbieten.

+1

Das ist nicht sehr gut ausgedrückt. "Lebensraum" sollte "lebenslang" sein. Offensichtlich muss der Aufrufer der Methode eine Referenz haben und die anonyme Klasseninstanz eine andere. Das Schlüsselwort 'final' verbietet jede Änderung an dieser * Variablen * nach der Initialisierung * während der Ausführung der Methode, die den gesamten Gültigkeitsbereich der Methode darstellt. – EJP

5

Wenn die anonyme Klasseninstanz zur Garbage Collection berechtigt ist, wird dieses Objekt für die Garbage Collection berechtigt, wenn sich nichts anderes auf das Objekt bezieht, das beim Aufruf der Methode als o bezeichnet wurde.

Endgültige Variablen, die die Garbage Collection verhindern, haben nichts besonderes.

2

"final" hat keine Auswirkungen auf GC. Das Objekt wird für die Erfassung verfügbar, wenn es nicht mehr erreichbar ist. In diesem Fall gibt es mindestens drei Referenzen, von denen jeder das stoppen kann: der 'final' Parameter, der verschwindet, wenn die Methode zurückkehrt; die Referenz des Anrufers; und die Kopie der letzten Variablen in der anonymen Klasseninstanz.