2009-08-04 13 views
5

właśnie grzebać w bibliotece świetlicy-IO i stwierdziliśmy:Odczekaj Garbage Collection konkretnego obiektu

 
Keeps track of files awaiting deletion, and deletes them when 
an associated marker object is reclaimed by the garbage collector. 

ten można znaleźć w dokumentacji obiektu FileCleaningTracker.

Teraz jestem ciekawy, jak mogę to zrobić sam? W jaki sposób mój kod może wykryć, kiedy obiekt zostanie odzyskany przez odśmiecacz?

Odpowiedz

9

Według the source code używa klasy PhantomReference. Zgodnie z dokumentacją:

Przedmioty fantomowe, które są zakotwiczone po kolektorze, określają, że ich referencje mogą zostać odzyskane. Odnośniki widmowe są najczęściej używane do planowania akcji oczyszczania przedśmiertnego w bardziej elastyczny sposób niż jest to możliwe w przypadku mechanizmu finalizacji Java.

Jeśli odśmiecacz określi w pewnym momencie, że odniesienie fantomowego odniesienia jest fantomem osiągalne, to w tym czasie lub w pewnym późniejszym momencie spowoduje ono dodanie do zbioru odniesienia.

Aby zapewnić, że obiekt podlegający odzyskaniu pozostanie taki, odniesienie odwołania fantomowego może nie zostać odzyskane: Metoda get odwołania fantomowego zawsze zwraca wartość null.

W odróżnieniu od miękkich i słabych odniesień odniesienia fantomowe nie są automatycznie usuwane przez kolektor śmieci podczas ich kolejkowania. Obiekt, do którego można dotrzeć za pomocą fantomowych odniesień, pozostanie taki, dopóki wszystkie takie odniesienia nie zostaną wyczyszczone lub same nie będą dostępne.

Konstruktor PhantomReference dwa argumenty:

referent - przedmiot nowe odniesienie fantomowego będzie odnosić się do

q - kolejkę w którym skierowana jest do rejestracji, lub zerowy, jeżeli rejestracja nie jest wymagana

Argument q jest inst z klasy ReferenceQueue. Numer PhantomReference zostanie dodany do tego ReferenceQueue, gdy stanie się fantomowo osiągalny. W takim przypadku można odzyskać PhantomReference, stosując metody poll() lub klasy ReferenceQueue.

Na przykład:

T objectToWatch = ...; 
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>(); 
new PhantomReference<T>(objectToWatch, referenceQueue); 

// Later on, probably in another thread... 
Reference<? extends T> nextReference = referenceQueue.remove(); 
// Tidy up! 

Uwaga: PhantomReference ma rodzeństwo klas nazwanych SoftReference i WeakReference, które mogą być również użyteczne. Relacje między nimi są udokumentowane w java.lang.ref package documentation.

1

Nie jestem pewien, czy to naprawdę odpowiada na twoje pytanie, ale metoda finalize() obiektu jest wywoływana przed odzyskiwaniem zasobów.

Edytuj: Oznacza to, że możesz wysłać wiadomość do innego obiektu, aby to ostrzec lub coś podobnego.

+4

Nie używaj finalizatorów do tego celu ani żadnego innego, jeśli możesz tego uniknąć. Nie ma gwarancji, że metoda finalize() zostanie wywołana natychmiast po wyrzuceniu elementów do śmieci lub nawet, że zostanie wywołana w ogóle (patrz Efektywna Java 2nd Ed, pozycja 7). Pakiet java.lang.ref jest drogą. – Leigh

+0

Jeśli możesz pomóc, nie używaj finalizatorów! http://stackoverflow.com/a/158791/74694 –

Powiązane problemy