2010-09-27 16 views

Odpowiedz

9

Obiekt nie zostanie odebrany, dopóki nie stanie się ponownie niedostępny.

Zgodnie z JavaDoc, finalize() nie będzie ponownie wywoływane.

3

Tak, dlatego nie używasz finalizatorów (Cóż, jeden z wielu powodów).

Istnieje zbiór referencji, który jest stworzony do robienia tego. Sprawdzę to i opublikuję tutaj za chwilę, ale myślę, że to PhantomReference.

Tak, PhantomReference:

obiekty referencyjne Phantom, które są skolejkowany po kolektora stwierdzi, że ich odniesień może inaczej być odzyskane. Odnośniki fantomowe są najczęściej używane do planowania akcji czyszczenia przedśmiertnego w bardziej elastyczny sposób niż jest to możliwe w przypadku mechanizmu finalizacji Java.

+0

Nie, to powód, dla którego nie należy pisać bardzo uszkodzonego finalizatora (jeśli nie ma wystarczających innych powodów). –

7

Jeśli zapoznasz się dokładnie z opisem interfejsu API, zobaczysz, że finalizator może sprawić, że obiekt będzie ponownie dostępny. Obiekt nie zostanie usunięty, dopóki nie będzie niedostępny (ponownie), ale finalize() nie zostanie wywołany więcej niż jeden raz.

+0

W rzeczywistości, finalizator * robi * sprawia, że ​​obiekt jest osiągalny dzięki odwołaniu do zrootowania między czasem, w którym obiekt jest nieosiągalny, a czasem jego finalizatorem. Jeśli w tym czasie obiekt, który został uznany za nieosiągalny, stanie się jedynym zachowanym odnośnikiem do innego obiektu, ten inny obiekt nie będzie kolekcjonowalny do czasu uruchomienia finalizatora lub unieważnienia odwołania za pomocą innych środków. – supercat

10

Następnie obiekt nie zbiera zasadniczo śmieci. To się nazywa zmartwychwstanie obiektu. Poszukaj tego terminu, a powinieneś otrzymać kilka interesujących artykułów. Jak wspomniał Jim, jednym ważnym punktem jest to, że finalizator zostanie uruchomiony tylko raz.

3

W rzeczywistości sprawdza kolejne przejście i upewnia się, że nie ma już żadnych odniesień do obiektu. Ponieważ nie powiedzie się temu testowi podczas jego drugiego przebiegu, w końcu nie zwalniasz pamięci dla obiektu.

Ponieważ finalizacja jest wywoływana tylko jeden raz dla dowolnego obiektu, następnym razem, gdy nie ma żadnych odniesień, po prostu zwolni pamięć bez wywoływania finalizacji. Kilka dobrych informacji na temat finalizacji here.

Powiązane problemy