Może skuszę się na słabą referencję... ale z czym to się je?
Referencja jak referencja, spotkał się z nią każdy:
String string = new String("123");
Słaba referencja wygląda trochę inaczej
Reference<String> refString = new WeakReference<String>(new String("123"));
a dostęp do obiektu, na który referencja wskazuje uzyskujemy za pomocą wywołania metody get()
refString,get();
Nie o wygląd jednak tutaj chodzi.
Dopóki obiekt w naszym programie wskazywany jest przez zwykłą referencję, nie zostanie on usunięty z pamięci przez jakże uwielbiany przez wszystkich Garbage Collector.
Natomiast obiekt wskazywany przez słabą referencję, może być usunięty przez GC jeżeli zacznie brakować pamięci, mimo, że referencja do niego cały czas jest obecna w programie. Metoda get() zwróci wtedy wartość null.
Nie wierzysz?
Oto krótki program obrazujący działanie słabych (i mocnych) referencji:
package pl.matt;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
public class WeakReferenceTest {
int[] tab = new int[1024];
public static void main(String[] args) {
// zwykła referencja
String string = new String("123");
// słaba referencja
Reference<String> refString = new WeakReference<String>(new String("456"));
System.out.println(string);
System.out.println(refString.get());
java.util.List<WeakReferenceTest> list = new ArrayList<WeakReferenceTest>();
for (int i = 0; i < 1000000; i++) {
WeakReferenceTest test = new WeakReferenceTest();
list.add(test);
if (refString.get() == null) {
System.out.println(string);
System.out.println(i + " " + refString.get());
break;
}
}
}
}
Program w pętli przydziela pamięć tworząc nowe obiekty klasy WeakReferenceTest(). W pewnym momencie zaczyna się uruchamiać Garbage Collector i usuwa z pamięci obiekt który wskazywała słaba referencja.
Oprócz słabych referencji, w javie mamy jeszcze "średnio mocne" referencje SoftReference. Zasada ich działania jest podobna, z tym, że obiekty przez nie wskazywane żyją dłużej.
Obiekt wskazywany przez miękką referencję zostanie usunięty z pamięci tuż przed rzuceniem wyjątku java.lang.OutOfMemoryError.
Doskonałe narzędzia, to implementacji mechanizmów pamięci podręcznej.
Żeby dopełnić obrazu całości... są jeszcze referencje fantomowe PhantomReference. Obiekty wskazywane przez te referencje są usuwane przy każdym uruchomieniu GC, o ile nie wskazuje na nie żadna inna referencja. Można je stosować, aby mieć informację o tym, kiedy dany obiekt został usunięty z pamięci.
Aż się głodny zrobiłem, czas chyba zjeść coś bardziej konkretnego.
PS. Czego używacie do przeglądania RSSów? Ja jak dotąd Thunderbirda, ale ciągle szukam czegoś lepszego.
i jak tylko znajdę wolną chwilę to postaram się wrzucić jakiś ciekawy wpis.
Zapraszam do lektury, dzielenia się wrażeniami i zadawania pytań. Mój mail: