2012-05-31 12 views
8

Jeśli mam kod podobny do poniższego:Garbage collection gdy zmienne końcowe stosowane w anonimowych klas

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

Kiedy o zostać zebrane śmieci, jeśli w ogóle? Tylko wtedy, gdy zadanie zostanie zebrane, czy pozostanie w pamięci na zawsze, ponieważ jest ostateczne?

Odpowiedz

7

omoże uzyskać śmieci zbierane, gdy nie jest już dostępna, czy jest ostateczna, czy nie. Oczywiście, o ile execute jest uruchomiony, jeśli potrzebuje dostępu o, będzie zapobiegać GC.

Po uruchomieniu execute przy założeniu, że nie zachowano żadnych odniesień do o (na przykład w kolekcji), zostanie oznaczony jako gotowy do czyszczenia pamięci.

2

Nie ma żadnego związku między final hasła i życia zmiennej.

To będą zbierane śmieci, gdy nie jest już potrzebny, a ponieważ jest to parametr ten może się zdarzyć tylko w boczną metody (jeśli nie ma odniesienia na zewnątrz).

Słowo kluczowe jest ograniczeniem nadanym kompilatorowi w celu uniemożliwienia dalszej modyfikacji odwołania pod numerem o po wywołaniu funkcji.

+1

To nie jest bardzo dobrze wyrażone. "Przestrzeń życiowa" powinna być "dożywotnią". Oczywiście osoba wywołująca metodę musi mieć odwołanie, a instancja klasy anonimowej ma inną. "Końcowe" słowo kluczowe zabrania jakiejkolwiek modyfikacji tej * zmiennej * po inicjalizacji, * podczas * wykonania metody, która jest całym jej zakresem. – EJP

5

Gdy anonimowe wystąpienie klasy staje się uprawnione do zbierania śmieci, jeśli nic nie odwołuje się do obiektu, o którym mowa w metodzie o, obiekt ten będzie kwalifikował się do zbierania śmieci.

Nie ma nic szczególnego w zmiennych końcowych który odstrasza zbierania śmieci.

2

'końcowy' nie ma wpływu na GC. Obiekt zostanie zakwalifikowany do odbioru, gdy stanie się nieosiągalny. W tym przypadku są co najmniej trzy odniesienia, z których każdy może zatrzymać: parametr "końcowy", który znika po powrocie metody; numer referencyjny dzwoniącego; oraz kopię ostatniej zmiennej w anonimowej instancji klasy.

Powiązane problemy