Referensi Lemah di Jawa

1. Ikhtisar

Pada artikel ini, kita akan melihat konsep referensi yang lemah - dalam bahasa Java.

Kami akan menjelaskan untuk apa ini, untuk apa mereka digunakan, dan bagaimana bekerja dengannya dengan benar.

2. Referensi yang Lemah

Objek yang direferensikan dengan lemah dihapus oleh Pengumpul Sampah saat tidak dapat dijangkau dengan lemah.

Jangkauan yang lemah berarti bahwa suatu objek tidak memiliki referensi kuat atau lunak yang menunjuk padanya . Objek dapat dicapai hanya dengan melintasi referensi yang lemah.

Pertama, Pengumpul Sampah menghapus referensi yang lemah, sehingga referensi tersebut tidak dapat diakses lagi. Kemudian referensi ditempatkan dalam antrian referensi (jika ada yang terkait) di mana kita dapat memperolehnya.

Pada saat yang sama, objek yang sebelumnya dapat dijangkau dengan lemah akan diselesaikan.

2.1. Referensi Lemah vs Lembut

Terkadang perbedaan antara referensi lemah dan lunak tidak jelas. Referensi lunak pada dasarnya adalah cache LRU yang besar. Artinya, kami menggunakan referensi lunak jika referensi memiliki peluang bagus untuk digunakan kembali dalam waktu dekat .

Karena referensi lunak bertindak sebagai cache, itu mungkin terus dapat dijangkau meskipun referensi itu sendiri tidak. Faktanya, referensi lunak memenuhi syarat untuk dikumpulkan jika dan hanya jika:

  • Rujukan tidak terlalu bisa dijangkau
  • Referensi lunak tidak sedang diakses baru-baru ini

Jadi referensi lunak mungkin tersedia selama beberapa menit atau bahkan beberapa jam setelah referensi tidak dapat dijangkau. Di sisi lain, referensi yang lemah hanya akan tersedia selama referennya masih ada.

3. Kasus Penggunaan

Seperti yang dinyatakan oleh dokumentasi Java, referensi lemah paling sering digunakan untuk mengimplementasikan pemetaan kanonikalisasi . Pemetaan disebut dikanonikalisasi jika hanya menampung satu contoh dari nilai tertentu. Alih-alih membuat objek baru, ia mencari yang sudah ada di pemetaan dan menggunakannya.

Tentu saja, penggunaan paling umum dari referensi ini adalah kelas WeakHashMap . Ini adalah implementasi antarmuka Peta di mana setiap kunci disimpan sebagai referensi lemah ke kunci yang diberikan. Saat Pengumpul Sampah menghapus kunci, entitas yang terkait dengan kunci ini juga akan dihapus.

Untuk informasi lebih lanjut, lihat panduan kami untuk WeakHashMap.

Area lain di mana mereka dapat digunakan adalah masalah Lapsed Listener .

Penerbit (atau subjek) memiliki referensi yang kuat ke semua pelanggan (atau pendengar) untuk memberi tahu mereka tentang peristiwa yang terjadi. Masalah muncul ketika pendengar tidak berhasil berhenti berlangganan dari penerbit.

Oleh karena itu, pendengar tidak dapat mengumpulkan sampah karena referensi yang kuat masih tersedia untuk penerbit. Akibatnya, kebocoran memori dapat terjadi.

Solusi untuk masalah dapat berupa subjek yang memiliki referensi lemah ke pengamat yang memungkinkan pengamat untuk mengumpulkan sampah tanpa perlu berhenti berlangganan (perhatikan bahwa ini bukan solusi lengkap, dan ini memperkenalkan beberapa masalah lain yang tidak tercakup di sini).

4. Bekerja Dengan Referensi yang Lemah

Referensi yang lemah diwakili oleh kelas java.lang.ref.WeakReference . Kita bisa menginisialisasinya dengan mengirimkan referensi sebagai parameter. Secara opsional, kami dapat menyediakan java.lang.ref.ReferenceQueue :

Object referent = new Object(); ReferenceQueue referenceQueue = new ReferenceQueue(); WeakReference weakReference1 = new WeakReference(referent); WeakReference weakReference2 = new WeakReference(referent, referenceQueue); 

Referensi referensi dapat diambil dengan metode get , dan dihapus secara manual menggunakan metode clear :

Object referent2 = weakReference1.get(); weakReference1.clear(); 

Pola kerja aman dengan referensi semacam ini sama dengan referensi lunak:

Object referent3 = weakReference2.get(); if (referent3 != null) { // GC hasn't removed the instance yet } else { // GC has cleared the instance }

5. Kesimpulan

Dalam tutorial singkat ini, kami telah melihat konsep tingkat rendah dari referensi lemah di Java - dan berfokus pada skenario paling umum untuk menggunakannya.