Sobes.tech
Middle

Ποιοι τύποι αναφορών υπάρχουν στη Java και ποια είναι τα χαρακτηριστικά τους;

sobes.tech AI

Απάντηση από AI

Στην Java, υπάρχουν τρεις βασικοί τύποι αναφορών (μεταβλητές αναφοράς) που διαφέρουν στη συμπεριφορά του συλλέκτη απορριμμάτων:

  • Ισχυρή Αναφορά (Strong Reference)
  • Μαλακή Αναφορά (Soft Reference)
  • Αδύναμη Αναφορά (Weak Reference)
  • Φανταστική Αναφορά (Phantom Reference)

Ισχυρή Αναφορά (Strong Reference)

Αυτή είναι ο πιο συνηθισμένος τύπος αναφοράς. Το αντικείμενο που δείχνει μια ισχυρή αναφορά δεν θα συλλεχθεί από τον συλλέκτη απορριμμάτων όσο υπάρχει τουλάχιστον μία ισχυρή αναφορά σε αυτό.

// Δημιουργία αντικειμένου και ισχυρής αναφοράς σε αυτό
Object myObject = new Object(); 

Μαλακή Αναφορά (Soft Reference)

Μαλακή αναφορά δείχνει σε ένα αντικείμενο που μπορεί να συλλεχθεί από τον συλλέκτη απορριμμάτων αν το JVM χρειάζεται μνήμη. Τα αντικείμενα που δείχνουν μόνο με μαλακές αναφορές δεν θα συλλεχθούν μέχρι να χρειαστεί πραγματικά η απελευθέρωση μνήμης. Συνήθως χρησιμοποιείται για caching.

import java.lang.ref.SoftReference;

// Δημιουργία αντικειμένου
Object data = new Object(); 
// Δημιουργία μαλακής αναφοράς
SoftReference<Object> softRef = new SoftReference<>(data); 

// Το αντικείμενο data μπορεί να συλλεχθεί αν η μνήμη είναι ανεπαρκής
// Αν το αντικείμενο δεν έχει συλλεχθεί, μπορούμε να το πάρουμε ξανά
Object retrievedData = softRef.get(); 

Αδύναμη Αναφορά (Weak Reference)

Αδύναμη αναφορά δείχνει σε ένα αντικείμενο που μπορεί να συλλεχθεί από τον συλλέκτη απορριμμάτων οποιαδήποτε στιγμή, αν δεν υπάρχουν άλλες ισχυρές αναφορές σε αυτό. Χρησιμοποιείται συχνά για υλοποίηση cache.

import java.lang.ref.WeakReference;

// Δημιουργία αντικειμένου
Object cacheEntry = new Object(); 
// Δημιουργία αδύναμης αναφοράς
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Το αντικείμενο cacheEntry μπορεί να συλλεχθεί οποιαδήποτε στιγμή
// Έλεγχος αν το αντικείμενο έχει συλλεχθεί
if (weakRef.get() == null) { 
    // Το αντικείμενο έχει συλλεχθεί
}

Φανταστική Αναφορά (Phantom Reference)

Η φανταστική αναφορά χρησιμοποιείται σε συνδυασμό με το ReferenceQueue για την εκτέλεση ενεργειών πριν το αντικείμενο διαγραφεί πλήρως από τη μνήμη. Το get() πάντα επιστρέφει null.

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

// Δημιουργία αντικειμένου για παρακολούθηση
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Δημιουργία φανταστικής αναφοράς και σύνδεσή της με την ουρά
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// Σε ξεχωριστό νήμα, μπορείτε να παρακολουθείτε την ουρά
// Όταν το αντικείμενο resource είναι έτοιμο για τελική διαγραφή, η φανταστική αναφορά θα εμφανιστεί στην ουρά

Χαρακτηριστικά και σύγκριση:

Τύπος Αναφοράς Συλλέκτης Απορριμμάτων Ανάκτηση αντικειμένου μέσω get() Χρήση
Ισχυρή Αναφορά Όχι Ναι Συνήθης χρήση
Μαλακή Αναφορά Μπορεί να συλλεχθεί Ναι (αν δεν έχει συλλεχθεί) Caching (όταν η μνήμη είναι περιορισμένη)
Αδύναμη Αναφορά Μπορεί να συλλεχθεί Ναι (αν δεν έχει συλλεχθεί) Caching (αν δεν υπάρχουν ισχυρές αναφορές)
Φανταστική Αναφορά Μπορεί να συλλεχθεί Όχι (πάντα null) Καθαρισμός πόρων πριν από διαγραφή (με ReferenceQueue)