Penggunaan referensi yang lemah adalah sesuatu yang belum pernah saya lihat implementasi, jadi saya mencoba mencari tahu apa use case untuk mereka dan bagaimana implementasi akan bekerja. Kapan Anda perlu menggunakan WeakHashMap
atau WeakReference
dan bagaimana itu digunakan?
java
weak-references
18Rbit
sumber
sumber
Jawaban:
Memahami Referensi Lemah , Ethan Nicholas
sumber
WeakHashMap
.WeakReference
melawanSoftReference
Satu perbedaan yang harus jelas adalah perbedaan antara a
WeakReference
dan aSoftReference
.Pada dasarnya a
WeakReference
akan menjadi GC-d oleh JVM dengan penuh semangat, setelah objek yang direferensikan tidak memiliki referensi keras untuk itu. SebuahSoftReference
d objek di sisi lain, akan cenderung ditinggalkan tentang oleh pengumpul sampah sampai benar-benar perlu untuk merebut kembali memori.Tembolok tempat nilai disimpan di dalam
WeakReference
s akan sangat tidak berguna (dalam aWeakHashMap
, itu adalah kunci yang direferensikan dengan lemah).SoftReferences
berguna untuk membungkus nilai-nilai ketika Anda ingin menerapkan cache yang dapat tumbuh dan menyusut dengan memori yang tersedia.sumber
Salah satu penggunaan umum
WeakReference
s danWeakHashMap
s khususnya adalah untuk menambahkan properti ke objek. Kadang-kadang Anda ingin menambahkan beberapa fungsionalitas atau data ke objek tetapi subclassing dan / atau komposisi bukanlah pilihan dalam hal itu hal yang jelas dilakukan adalah membuat hashmap yang menghubungkan objek yang ingin Anda rentangkan ke properti yang ingin Anda tambahkan . maka setiap kali Anda membutuhkan properti Anda bisa mencarinya di peta. Namun, jika objek yang Anda tambahkan properti cenderung dihancurkan dan dibuat banyak, Anda dapat berakhir dengan banyak objek lama di peta Anda yang menghabiskan banyak memori.Jika Anda menggunakan
WeakHashMap
objek, objek akan meninggalkan peta Anda segera setelah tidak lagi digunakan oleh program Anda, yang merupakan perilaku yang diinginkan.Aku harus melakukan ini untuk menambahkan beberapa data untuk
java.awt.Component
untuk berkeliling perubahan dalam JRE antara 1.4.2 dan 1.5, saya bisa tetap dengan subclassing setiap komponen saya tertarik int (JButton
,JFrame
,JPanel
....) tapi ini jauh lebih mudah dengan kode lebih sedikit.sumber
Kasus lain yang bermanfaat untuk
WeakHashMap
danWeakReference
adalah implementasi pendengar .Ketika Anda membuat sesuatu yang ingin mendengarkan acara tertentu, biasanya Anda mendaftarkan pendengar, misalnya
Jika
manager
toko menyimpan pendengar Anda denganWeakReference
, itu berarti Anda tidak perlu menghapus register misalnya denganmanager.removeListener(myListenerImpl)
karena akan dihapus secara otomatis setelah pendengar Anda atau komponen Anda memegang pendengar menjadi tidak tersedia.Tentu saja Anda masih dapat menghapus pendengar Anda secara manual, tetapi jika Anda tidak atau Anda melupakannya, itu tidak akan menyebabkan kebocoran memori, dan itu tidak akan mencegah pendengar Anda menjadi sampah yang dikumpulkan.
Dari mana datangnya
WeakHashMap
gambar itu?Registri pendengar yang ingin menyimpan pendengar terdaftar sebagai
WeakReference
perlu koleksi untuk menyimpan referensi ini. Tidak adaWeakHashSet
implementasi di perpustakaan Java standar hanyaWeakHashMap
tetapi kita dapat dengan mudah menggunakan yang terakhir untuk "menerapkan" fungsi yang pertama:Dengan ini
listenerSet
untuk mendaftarkan pendengar baru Anda hanya perlu menambahkannya ke set, dan bahkan jika itu tidak dihapus secara eksplisit, jika pendengar tidak lagi direferensikan, itu akan dihapus secara otomatis oleh JVM.sumber
WeakHashMap
adalah kapan pun Anda membutuhkanHashMap
objek. Jadi wow Anda tidak perlu secara manual melakukan hashmap.remove ever karena item secara otomatis dihapus setelah obj keluar dari ruang lingkup! Sungguh ajaib! Peretasan sihir jelek seperti itu adalah wajah yang lengkap .WeakReference
sangat menyederhanakan basis kode dan menghindari bug yang tidak perlu terkait dengan gagal berhenti berlangganan. Kelemahan apa?Posting blog ini menunjukkan penggunaan kedua kelas: Java: sinkronisasi pada ID . Penggunaannya berlangsung seperti ini:
IdMutextProvider menyediakan objek berbasis id untuk disinkronkan. Persyaratannya adalah:
Ini dicapai menggunakan peta jenis penyimpanan internal:
Objek adalah kunci dan nilai. Ketika tidak ada eksternal untuk peta yang memiliki referensi keras ke objek, itu bisa menjadi sampah yang dikumpulkan. Nilai-nilai di peta disimpan dengan referensi keras, sehingga nilainya harus dibungkus dalam Referensi Lemah untuk mencegah kebocoran memori. Hal terakhir ini tercakup dalam javadoc .
sumber
Jika Anda misalnya ingin melacak semua objek yang dibuat dari kelas tertentu. Untuk tetap membiarkan objek-objek ini menjadi sampah yang dikumpulkan, Anda menyimpan daftar / peta referensi lemah ke objek bukan objek itu sendiri.
Sekarang jika seseorang bisa menjelaskan referensi hantu kepada saya, saya akan senang ...
sumber
Seperti yang dinyatakan di atas, referensi lemah ditahan selama referensi kuat ada.
Contoh penggunaan adalah dengan menggunakan WeakReference di dalam pendengar, sehingga pendengar tidak lagi aktif setelah referensi utama ke objek target mereka hilang. Perhatikan bahwa ini tidak berarti WeakReference dihapus dari daftar pendengar, pembersihan masih diperlukan tetapi dapat dilakukan, misalnya, pada waktu yang dijadwalkan. Ini juga memiliki efek mencegah objek mendengarkan dari memegang referensi kuat dan akhirnya menjadi sumber memori kembung. Contoh: Ayunan komponen GUI merujuk model yang memiliki siklus hidup lebih lama dari jendela.
Saat bermain dengan pendengar seperti dijelaskan di atas, kami dengan cepat menyadari bahwa objek dikumpulkan "segera" dari sudut pandang pengguna.
sumber
WeakReferences
komentar Anda sepenuhnya salah!Satu penggunaan dunia nyata yang saya miliki untuk WeakReferences adalah jika Anda memiliki objek tunggal yang sangat besar yang jarang digunakan. Anda tidak ingin menyimpannya di memori ketika tidak dibutuhkan; tetapi, jika utas lain membutuhkan objek yang sama, Anda juga tidak ingin keduanya dalam memori. Anda dapat menyimpan referensi yang lemah ke objek di suatu tempat, dan referensi keras dalam metode yang menggunakannya; ketika kedua metode selesai, objek akan dikumpulkan.
sumber
Saya melakukan pencarian kode google untuk "WeakHashMap ()" baru.
Saya mendapat banyak pertandingan dari proyek classpath GNU dan
sumber
Anda bisa menggunakan weakhashmap untuk mengimplementasikan caching bebas sumber daya untuk pembuatan objek yang luas.
tetapi perhatikan bahwa tidak diinginkan memiliki objek yang bisa berubah. saya menggunakannya untuk men-cache hasil query (yang membutuhkan sekitar 400 ms untuk dieksekusi) ke mesin pencari teks, yang jarang diperbarui.
sumber