Referensi Lunak di Jawa

1. Ikhtisar

Dalam artikel singkat ini, kita akan berbicara tentang referensi lunak di Java.

Kami akan menjelaskan apa itu, mengapa kami membutuhkannya, dan cara membuatnya.

2. Apa Itu Referensi Lunak?

Objek referensi lunak (atau objek yang dapat dijangkau dengan mudah) dapat dibersihkan oleh Pengumpul Sampah sebagai respons terhadap permintaan memori. Objek yang dapat dijangkau dengan lembut tidak memiliki referensi kuat yang menunjuk ke sana .

Saat Pengumpul Sampah dipanggil, ia mulai mengulang semua elemen di heap. GC menyimpan objek tipe referensi dalam antrian khusus.

Setelah semua objek di heap diperiksa, GC menentukan instance mana yang harus dihapus dengan menghapus objek dari antrean yang disebutkan di atas.

Aturan ini bervariasi dari satu implementasi JVM ke implementasi lainnya, tetapi dokumentasi menyatakan bahwa semua referensi lunak ke objek yang dapat dijangkau dengan lembut dijamin akan dihapus sebelum JVM melontarkan OutOfMemoryError.

Padahal, tidak ada jaminan yang diberikan pada saat referensi lunak dihapus atau urutan di mana kumpulan referensi tersebut ke objek yang berbeda dihapus.

Sebagai aturan, implementasi JVM memilih antara pembersihan referensi yang baru dibuat atau yang baru saja digunakan.

Objek yang dapat dijangkau dengan lembut akan tetap hidup selama beberapa waktu setelah terakhir kali direferensikan. Nilai defaultnya adalah satu detik seumur hidup per megabyte gratis di heap. Nilai ini dapat disesuaikan menggunakan tanda -XX: SoftRefLRUPolicyMSPerMB .

Misalnya, untuk mengubah nilainya menjadi 2.5 detik (2500 milidetik), kita dapat menggunakan:

-XX:SoftRefLRUPolicyMSPerMB=2500

Dibandingkan dengan referensi lemah, referensi lunak dapat memiliki masa pakai yang lebih lama karena terus ada hingga memori tambahan diperlukan.

Oleh karena itu, mereka adalah pilihan yang lebih baik jika kita perlu menyimpan objek dalam memori selama mungkin.

3. Kasus Penggunaan Referensi Lunak

Referensi lunak dapat digunakan untuk mengimplementasikan cache yang sensitif terhadap memori di mana manajemen memori merupakan faktor yang sangat penting.

Selama referensi referensi lunak sangat mudah dijangkau, yaitu - sebenarnya digunakan, referensi tidak akan dihapus.

Cache dapat, misalnya, mencegah entri yang paling baru-baru ini digunakan agar tidak dibuang dengan menyimpan referensi yang kuat ke entri tersebut, membiarkan entri yang tersisa dibuang sesuai kebijaksanaan Pengumpul Sampah.

4. Bekerja Dengan Referensi Lembut

Di Java, soft reference diwakili oleh kelas java.lang.ref.SoftReference .

Kami memiliki dua opsi untuk memulainya.

Cara pertama adalah dengan meneruskan referensi saja:

StringBuilder builder = new StringBuilder(); SoftReference reference1 = new SoftReference(builder);

Opsi kedua menyiratkan penerusan referensi ke java.lang.ref.ReferenceQueue serta referensi ke referensi. Antrean referensi dirancang untuk membuat kami sadar akan tindakan yang dilakukan oleh Pengumpul Sampah. Ini menambahkan objek referensi ke antrian referensi saat memutuskan untuk menghapus referensi dari referensi ini.

Berikut cara menginisialisasi SoftReference dengan ReferenceQueue:

ReferenceQueue referenceQueue = new ReferenceQueue(); SoftReference reference2 = new SoftReference(builder, referenceQueue);

Sebagai java.lang.ref.Reference , ini berisi metode get dan clear untuk mendapatkan dan menyetel ulang referensi masing-masing:

StringBuilder builder1 = reference2.get(); reference2.clear(); StringBuilder builder2 = reference2.get(); // null 

Setiap kali kita bekerja dengan referensi semacam ini, kita perlu memastikan bahwa referensi, yang dikembalikan oleh get , ada:

StringBuilder builder3 = reference2.get(); if (builder3 != null) { // GC hasn't removed the instance yet } else { // GC has cleared the instance }

5. Kesimpulan

Dalam tutorial ini, kami mengenal konsep referensi lunak dan kasus penggunaannya.

Selain itu, kami telah mempelajari cara membuatnya dan bekerja dengannya secara terprogram.