8.1 Rujukan yang lemah di Jawa
Terdapat beberapa jenis rujukan di Jawa.
Terdapat StrongReference - ini adalah pautan paling biasa yang kami buat setiap hari.
Object object = new Object();//created an object
object = null;//can now be garbage collected
Dan terdapat tiga jenis pautan "istimewa" - SoftReference, WeakReference, PhantomReference. Sebenarnya, terdapat hanya satu perbezaan antara semua jenis pautan - kelakuan GC dengan objek yang dirujuknya. Kami akan membincangkan spesifik setiap jenis pautan dengan lebih terperinci kemudian, tetapi buat masa ini, pengetahuan berikut akan mencukupi:
- SoftReference ialah rujukan lembut, jika GC melihat bahawa objek hanya boleh diakses melalui rangkaian rujukan lembut, maka ia akan mengeluarkannya daripada ingatan. Mungkin.
- WeakReference - rujukan yang lemah, jika GC melihat bahawa objek hanya boleh diakses melalui rantaian rujukan yang lemah, maka ia akan mengeluarkannya dari ingatan.
- PhantomReference ialah rujukan hantu, jika GC melihat bahawa objek hanya tersedia melalui rangkaian rujukan hantu, maka ia akan mengeluarkannya daripada ingatan. Selepas beberapa kali GC.
Anda juga boleh mengatakan bahawa jenis pautan mempunyai tahap kelembutan tertentu:
- Pautan keras biasa ialah sebarang pembolehubah jenis rujukan. Tidak dibersihkan oleh pemungut sampah sebelum ia tidak digunakan.
- SoftReference . Objek tidak akan menyebabkan semua memori digunakan - ia dijamin akan dipadamkan sebelum OutOfMemoryError berlaku. Mungkin lebih awal, bergantung kepada pelaksanaan pengutip sampah.
- Rujukan Lemah . Lemah lembut. Tidak menghalang objek daripada dilupuskan; pemungut sampah mengabaikan rujukan sedemikian.
- PhantomReference . Digunakan untuk pemprosesan "kematian" sesuatu objek: objek itu tersedia selepas pemuktamadkan sehingga ia dikumpul sampah.
Jika masih belum jelas apa perbezaannya, maka jangan risau, tidak lama lagi semuanya akan jatuh ke tempatnya. Butiran ada dalam butiran, dan butiran akan menyusul.
8.2 WeakReference dan SoftReference dalam Java
Pertama, mari kita lihat perbezaan antara WeakReference dan SoftReference di Java.
Pendek kata, pemungut sampah akan membebaskan ingatan objek jika hanya rujukan yang lemah menunjuk kepadanya. Jika objek ditunjuk oleh SoftReferences, maka memori dialokasikan apabila JVM sangat memerlukan memori.
Ini memberikan kelebihan yang pasti kepada SoftReference berbanding rujukan Strong dalam kes tertentu. Sebagai contoh, SoftReference digunakan untuk melaksanakan cache aplikasi, jadi perkara pertama yang JVM akan lakukan ialah memadam objek yang hanya SoftReferences tunjuk.
WeakReference bagus untuk menyimpan metadata, seperti menyimpan rujukan kepada ClassLoader. Jika tiada kelas dimuatkan, maka anda tidak seharusnya merujuk kepada ClassLoader. Inilah sebabnya WeakReference membolehkan pemungut sampah melakukan kerjanya pada ClassLoader sebaik sahaja rujukan kuat terakhir kepadanya dialih keluar.
Contoh WeakReference dalam Java:
// 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 dalam Java:
// 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 PhantomReference dalam Java
Contoh PhantomReference dicipta dengan cara yang sama seperti dalam contoh WeakReference dan SoftReference, tetapi ia jarang digunakan.
PhantomReference boleh menjadi sampah yang dikumpul jika objek tidak mempunyai rujukan kuat (Kuat), lemah (WeakReference), atau lembut (SoftReference).
Anda boleh membuat objek Rujukan Phantom seperti ini:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference boleh digunakan dalam situasi di mana finalize() tidak masuk akal. Jenis rujukan ini berbeza daripada jenis lain kerana ia tidak direka untuk mengakses objek. Ia adalah isyarat bahawa objek itu telah dimuktamadkan dan pemungut sampah bersedia untuk menuntut semula ingatannya.
Untuk melakukan ini, pemungut sampah meletakkannya dalam ReferenceQueue khas untuk pemprosesan selanjutnya. ReferenceQueue ialah tempat rujukan objek diletakkan untuk membebaskan memori.
Rujukan hantu adalah cara selamat untuk mengetahui bahawa objek telah dialih keluar daripada ingatan. Sebagai contoh, pertimbangkan aplikasi yang berkaitan dengan imej besar. Katakan kita mahu memuatkan imej ke dalam ingatan apabila ia sudah ada dalam ingatan, yang sedia untuk kutipan sampah. Dalam kes ini, kami mahu menunggu pemungut sampah membunuh imej lama sebelum memuatkan imej baharu ke dalam ingatan.
Di sini PhantomReference ialah pilihan yang fleksibel dan selamat. Rujukan kepada imej lama akan dihantar ke ReferenceQueue selepas objek imej lama dimusnahkan. Sebaik sahaja kami mempunyai pautan ini, kami boleh memuatkan imej baharu ke dalam ingatan.