8.1 Referensi lemah di Jawa
Ada beberapa macam referensi di Jawa.
Ada StrongReference - ini adalah tautan paling umum yang kami buat setiap hari.
Object object = new Object();//created an object
object = null;//can now be garbage collected
Dan ada tiga jenis tautan "khusus" - SoftReference, WeakReference, PhantomReference. Faktanya, hanya ada satu perbedaan antara semua jenis tautan - perilaku GC dengan objek yang dirujuknya. Kami akan membahas spesifikasi masing-masing jenis tautan secara lebih rinci nanti, tetapi untuk saat ini, pengetahuan berikut sudah cukup:
- SoftReference adalah referensi lunak, jika GC melihat bahwa suatu objek hanya dapat diakses melalui rangkaian referensi lunak, maka itu akan menghapusnya dari memori. Mungkin.
- Referensi Lemah - referensi lemah, jika GC melihat bahwa suatu objek hanya dapat diakses melalui rantai referensi lemah, maka itu akan menghapusnya dari memori.
- PhantomReference adalah referensi phantom, jika GC melihat bahwa suatu objek hanya tersedia melalui rantai referensi phantom, maka itu akan menghapusnya dari memori. Setelah beberapa kali menjalankan GC.
Anda juga dapat mengatakan bahwa jenis tautan memiliki tingkat kelembutan tertentu:
- Tautan keras biasa adalah variabel apa pun dari jenis referensi. Tidak dibersihkan oleh pengumpul sampah sebelum menjadi tidak terpakai.
- Referensi Lembut . Objek tidak akan menyebabkan semua memori habis - dijamin akan dihapus sebelum terjadi OutOfMemoryError. Mungkin lebih awal, tergantung implementasi dari pengumpul sampah.
- Referensi Lemah . Lebih lemah lembut. Tidak mencegah objek dibuang; pengumpul sampah mengabaikan referensi tersebut.
- Referensi Hantu . Digunakan untuk pemrosesan "kematian" suatu objek: objek tersedia setelah finalisasi hingga sampah dikumpulkan.
Jika belum jelas apa bedanya, maka jangan khawatir, sebentar lagi semuanya akan beres. Detailnya ada di detailnya, dan detailnya akan menyusul.
8.2 Referensi Lemah dan Referensi Lunak di Jawa
Pertama, mari kita lihat perbedaan antara WeakReference dan SoftReference di Java.
Singkatnya, pengumpul sampah akan membebaskan memori suatu objek jika hanya referensi lemah yang menunjuk ke sana. Jika objek diarahkan oleh SoftReferences, maka memori akan dibatalkan alokasinya saat JVM sangat membutuhkan memori.
Ini memberikan keuntungan yang pasti untuk SoftReference dibandingkan referensi Kuat dalam kasus-kasus tertentu. Misalnya, SoftReference digunakan untuk mengimplementasikan cache aplikasi, jadi hal pertama yang akan dilakukan JVM adalah menghapus objek yang hanya ditunjuk oleh SoftReferences.
WeakReference bagus untuk menyimpan metadata, seperti menyimpan referensi ke ClassLoader. Jika tidak ada kelas yang dimuat, maka Anda sebaiknya tidak merujuk ke ClassLoader. Inilah mengapa WeakReference memungkinkan pengumpul sampah untuk melakukan tugasnya di ClassLoader segera setelah referensi kuat terakhir untuk itu dihapus.
Contoh Referensi Lemah di Jawa:
// some object
Student student = new Student();
// weak reference to it
WeakReference weakStudent = new WeakReference(student);
// now the Student object can be garbage collected
student = null;
Contoh SoftReference di Jawa:
// some object
Student student = new Student();
// weak reference to it
SoftReference softStudent = new SoftReference(student)
// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;
8.3 Referensi Phantom di Jawa
Instance PhantomReference dibuat dengan cara yang sama seperti pada contoh WeakReference dan SoftReference, tetapi jarang digunakan.
PhantomReference dapat menjadi sampah yang dikumpulkan jika objek tidak memiliki referensi yang kuat (Strong), lemah (WeakReference), atau lunak (SoftReference).
Anda dapat membuat objek Referensi Phantom seperti ini:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference dapat digunakan dalam situasi di mana finalize() tidak masuk akal. Tipe referensi ini berbeda dengan tipe lainnya karena tidak dirancang untuk mengakses objek. Ini adalah sinyal bahwa objek telah diselesaikan dan pengumpul sampah siap untuk mendapatkan kembali ingatannya.
Untuk melakukan ini, pengumpul sampah menempatkannya di ReferenceQueue khusus untuk diproses lebih lanjut. ReferenceQueue adalah tempat referensi objek ditempatkan untuk membebaskan memori.
Referensi phantom adalah cara yang aman untuk mengetahui bahwa suatu objek telah dihapus dari memori. Misalnya, pertimbangkan aplikasi yang berhubungan dengan gambar besar. Katakanlah kita ingin memuat gambar ke dalam memori saat sudah ada di memori, yang siap untuk pengumpulan sampah. Dalam hal ini, kami ingin menunggu pengumpul sampah mematikan gambar lama sebelum memuat gambar baru ke dalam memori.
Di sini PhantomReference adalah pilihan yang fleksibel dan aman. Referensi ke gambar lama akan diteruskan ke ReferenceQueue setelah objek gambar lama dihancurkan. Setelah kami memiliki tautan ini, kami dapat memuat gambar baru ke dalam memori.