Mengetahui konsep referensi yang lemah dan lunak berbeda dari cara menggunakannya. Kita semua tahu bahwa pengumpul sampah merebut kembali memori untuk objek yang memenuhi kriteria daur ulang, tetapi tidak semua programmer tahu bahwa kriteria daur ulang tergantung pada jenis referensi yang menunjuk pada objek. Ini adalah perbedaan utama antara referensi lemah dan referensi lunak di Java. Jika suatu objek hanya memiliki referensi lemah yang menunjuk ke sana, pengumpul sampah mendaur ulang objek segera, yang merupakan cara mendesak untuk mendaur ulangnya. Relatif, jika ada referensi lunak yang menunjuk pada objek -objek ini, mereka hanya akan didaur ulang jika JVM membutuhkan memori. Perilaku khusus kutipan yang lemah dan lembut membuatnya sangat berguna dalam beberapa kasus. Misalnya: Referensi lunak dapat digunakan dengan baik untuk mengimplementasikan cache. Referensi yang lemah sangat cocok untuk menyimpan metadata, seperti menyimpan referensi classloader.如果没有类被加载,那么也没有指向ClassLoader的引用。一旦上一次的强引用被去除,只有弱引用的ClassLoader就会被回收。这篇文章中我们将讲述不同类型的Java引用,例如:强引用(Strong Reference)和虚引用(PhantomReference)。
Java中弱引用VS软引用
Java中有如下四种类型的引用:
1.强引用(Strong Reference)
2. Referensi lemah
3. Softreference
4. Phantomreference
Referensi yang kuat adalah referensi paling sederhana yang kami gunakan dalam pemrograman, seperti variabel S dalam kode string S = "ABC" adalah referensi yang kuat untuk objek string "ABC". Objek apa pun yang ditunjuk oleh referensi yang kuat tidak dapat didaur ulang oleh pengumpul sampah, dan objek ini diperlukan dalam program. Referensi yang lemah diwakili oleh kelas kelas kelas Java.lang.ref.weakreference, dan Anda dapat membuat referensi yang lemah menggunakan kode berikut:
Salinan kode adalah sebagai berikut:
Counter counter = counter baru (); // Referensi yang kuat - Baris 1
Lemah Lemari <Counter> Lemari = Referensi Lemah Baru <Counter> (counter);
counter = null; // sekarang counter objek memenuhi syarat untuk pengumpulan sampah
Sekarang selama Anda menetapkan nilai nol ke penghitung objek referensi yang kuat, objek dapat didaur ulang oleh pengumpul sampah. Karena objek tidak lagi berisi referensi kuat lainnya saat ini, bahkan Lemah menunjuk ke objek tidak dapat mencegah pengumpul sampah mendaur ulang objek. Sebaliknya, jika objek berisi referensi lunak, objek penghitung tidak segera didaur ulang kecuali JVM membutuhkan memori. Referensi lunak di Java diwakili oleh kelas java.lang.ref.softreference.
Salinan kode adalah sebagai berikut:
Counter prime = counter baru (); // prime memegang baris referensi yang kuat 2
Softreference Soft = Softreference baru (prime);
prime = null; // sekarang objek counter memenuhi syarat untuk pengumpulan sampah tetapi hanya dikumpulkan ketika JVM benar -benar membutuhkan memori
Setelah referensi yang kuat kosong, perilaku kedua kode, penghitung, membuat referensi yang lembut. Mengingat perbedaan ini antara referensi lunak dan referensi yang lemah, referensi lunak lebih cocok untuk mekanisme caching, sementara referensi yang lemah lebih cocok untuk menyimpan metadata.另一个使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一种实现。 Lemarihashmap memiliki fitur: Kunci dalam peta dienkapsulasi sebagai referensi yang lemah, yang berarti bahwa begitu referensi kuat dihapus, referensi lemah di dalam weakhashmap tidak dapat mencegah objek dikumpulkan oleh pengumpul sampah.
虚引用是java.lang.ref package包中第三种可用的引用,使用java.lang.ref.PhantomReference类来表示。 Objek dengan referensi virtual dapat didaur ulang oleh pengumpul sampah kapan saja. Mirip dengan referensi yang lemah dan referensi lunak, Anda dapat membuat referensi virtual melalui kode berikut:
Salinan kode adalah sebagai berikut:
DigitalCounter Digit = DigitalCounter baru (); // Variabel Referensi Digit memiliki baris referensi yang kuat 3
Phantomreference Phantom = New Phantomreference (Digit);
digit = null;
一旦移除强引用,第三行的DigitalCounter对象可以在任何时候被垃圾回收器回收。 Karena hanya ada satu referensi virtual yang menunjuk pada objek, referensi virtual tidak dapat mencegah pengumpul sampah dari merebut kembali objek.
除了了解弱引用、软引用、虚引用和WeakHashMap,还需要了解ReferenceQueue。 Dalam proses pembuatan referensi lemah, referensi lunak, dan referensi virtual, Anda dapat memberikan Referensi Referensi Referensi Referensi melalui kode berikut:
Salinan kode adalah sebagai berikut:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter Digit = DigitalCounter baru ();
Phantomreference <DigitalCounter> phantom = Phantomreference baru <DigitalCounter> (digit, refqueue);
Contoh referensi ditambahkan ke antrian referensi, dan Anda dapat mendaur ulang objek dengan menanyakan antrian referensi kapan saja. Siklus hidup suatu objek dapat dijelaskan pada gambar di bawah ini: