Szukaj…


Różne typy referencyjne

Pakiet java.lang.ref zapewnia klasy obiektów referencyjnych, które obsługują ograniczony stopień interakcji z modułem wyrzucania elementów bezużytecznych.

Java ma cztery główne różne typy referencji. Oni są:

  • Silne odniesienie
  • Słabe odniesienie
  • Miękkie odniesienie
  • Phantom Reference

1. Silne odniesienie

Jest to zwykła forma tworzenia obiektów.

MyObject myObject = new MyObject();

Uchwyt zmiennej utrzymuje silne odniesienie do utworzonego obiektu. Dopóki ta zmienna jest aktywna i ma tę wartość, instancja MyObject nie będzie gromadzona przez MyObject elementy bezużyteczne.

2. Słabe odniesienie

Jeśli nie chcesz dłużej utrzymywać obiektu, a musisz jak najszybciej wyczyścić / zwolnić pamięć przydzieloną dla obiektu, możesz to zrobić w ten sposób.

WeakReference myObjectRef = new WeakReference(MyObject);

Po prostu słabe odniesienie to odniesienie, które nie jest wystarczająco silne, aby zmusić obiekt do pozostania w pamięci. Słabe referencje pozwalają na wykorzystanie zdolności śmieciarza do określenia osiągalności dla ciebie, więc nie musisz tego robić sam.

Gdy potrzebujesz utworzonego obiektu, po prostu użyj metody .get() :

myObjectRef.get();

Poniższy kod będzie tego przykładem:

WeakReference myObjectRef = new WeakReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the object reference address
System.gc();
System.out.println(myObjectRef.get()); // This will print 'null' if the GC cleaned up the object

3. Miękkie odniesienie

Miękkie odniesienia są nieco silniejsze niż słabe odniesienia. Możesz utworzyć miękki obiekt odniesienia w następujący sposób:

SoftReference myObjectRef = new SoftReference(MyObject);

Mogą silniej trzymać pamięć niż słabe odniesienie. Jeśli masz wystarczającą ilość zasobów / zasobów pamięci, śmieciarz nie wyczyści miękkich referencji tak entuzjastycznie jak słabych referencji.

Miękkie odniesienia są przydatne w buforowaniu. Możesz tworzyć obiekty z miękkimi odnośnikami jako pamięć podręczną, w której są one przechowywane do momentu wyczerpania pamięci. Kiedy twoja pamięć nie może zapewnić wystarczającej ilości zasobów, śmieciarz usunie miękkie odniesienia.

SoftReference myObjectRef = new SoftReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the reference address of the Object
System.gc();
System.out.println(myObjectRef.get()); // This may or may not print the reference address of the Object

4. Phantom Reference

Jest to najsłabszy typ odwołania. Jeśli utworzono odwołanie do obiektu za pomocą Phantom Reference, metoda get() zawsze zwróci null!

Wykorzystanie tego odwołania polega na tym, że „Obiekty referencyjne fantomów, które są umieszczane w kolejce po tym, jak kolektor ustali, że ich referencje mogą zostać w przeciwnym razie odzyskane. Referencje fantomowe są najczęściej używane do planowania działań przedśmiertnych w bardziej elastyczny sposób niż jest to możliwe w przypadku Mechanizm finalizacji Java ”. - Od Phantom Reference Javadoc z Oracle.

Możesz utworzyć obiekt Phantom Reference w następujący sposób:

PhantomReference myObjectRef = new PhantomReference(MyObject);


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow