Rujukan Lembut di Jawa

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kita akan membincangkan mengenai rujukan lembut di Java.

Kami akan menerangkan apa itu, mengapa kami memerlukannya, dan bagaimana membuatnya.

2. Apakah Rujukan Lembut?

Objek rujukan lembut (atau objek yang mudah dijangkau) dapat dibersihkan oleh Pengumpul Sampah sebagai tindak balas terhadap permintaan memori. Objek yang mudah dijangkau tidak mempunyai rujukan kuat yang menunjuk ke arahnya .

Apabila Pemungut Sampah dipanggil, ia mula berulang pada semua elemen di timbunan. GC menyimpan objek jenis rujukan dalam barisan khas.

Setelah semua objek di timbunan diperiksa, GC menentukan contoh mana yang harus dikeluarkan dengan membuang objek dari barisan yang disebutkan di atas.

Peraturan ini berbeza dari satu pelaksanaan JVM ke yang lain, tetapi dokumentasinya menyatakan bahawa semua rujukan lembut ke objek yang dapat dijangkau dengan lembut dijamin akan dihapus sebelum JVM melemparkan OutOfMemoryError.

Walaupun demikian, tidak ada jaminan yang diberikan pada saat rujukan lembut dibersihkan atau urutan di mana satu set rujukan ke objek yang berlainan dibersihkan.

Sebagai peraturan, pelaksanaan JVM memilih antara pembersihan rujukan yang baru dibuat atau yang baru digunakan.

Objek yang mudah dijangkau akan tetap hidup untuk beberapa lama setelah kali terakhir ia dirujuk. Nilai lalai adalah satu saat seumur hidup setiap megabait percuma di timbunan. Nilai ini dapat disesuaikan menggunakan bendera -XX: SoftRefLRUPolicyMSPerMB .

Sebagai contoh, untuk menukar nilainya menjadi 2.5 saat (2500 milisaat), kita dapat menggunakan:

-XX:SoftRefLRUPolicyMSPerMB=2500

Sebagai perbandingan dengan rujukan yang lemah, rujukan lembut dapat mempunyai jangka hayat yang lebih lama kerana ia terus ada sehingga memori tambahan diperlukan.

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

3. Kes Penggunaan Rujukan Lembut

Rujukan lembut boleh digunakan untuk melaksanakan cache sensitif memori di mana pengurusan memori adalah faktor yang sangat penting.

Selagi referensi rujukan lembut sangat mudah dijangkau, iaitu - sebenarnya digunakan, rujukan tidak akan dihapus.

Sebagai contoh, cache dapat mengelakkan entri yang paling baru digunakan daripada dibuang dengan menyimpan rujukan yang kuat pada entri tersebut, membiarkan baki entri dibuang mengikut budi bicara Pengumpul Sampah.

4. Bekerja Dengan Rujukan Lembut

Di Java, rujukan lembut diwakili oleh kelas java.lang.ref.SoftReference .

Kami mempunyai dua pilihan untuk memulakannya.

Cara pertama adalah dengan memberikan referensi sahaja:

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

Pilihan kedua bermaksud memberikan rujukan ke java.lang.ref.ReferenceQueue serta rujukan ke rujukan. Antrian rujukan dirancang untuk membuat kita mengetahui tindakan yang dilakukan oleh Pemungut Sampah. Ia menambahkan objek rujukan ke barisan rujukan kerana ia memutuskan untuk membuang rujukan rujukan ini.

Inilah cara untuk memulakan SoftReference dengan ReferenceQueue:

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

Sebagai rujukan java.lang.ref. , ia mengandungi kaedah mendapatkan dan jelas untuk mendapatkan dan menetapkan semula rujukan masing-masing:

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

Setiap kali kita menggunakan rujukan seperti ini, kita perlu memastikan bahawa rujukan, 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 dapat mengetahui konsep rujukan lembut dan kes penggunaannya.

Kami juga telah belajar bagaimana membuatnya dan bekerja dengannya secara teratur.