Konsep kutipan yang kuat, kutipan lunak, kutipan yang lemah, dan kutipan virtual
Referensi yang kuat
Kutipan yang kuat mengacu pada kutipan umum dalam kode program. Misalnya, objek dan STR dalam kode berikut keduanya kutipan yang kuat:
Objek objek = objek baru (); String str = "halo";
Selama suatu objek memiliki referensi yang kuat yang terkait dengannya, JVM pasti tidak akan mendaur ulang objek ini. Bahkan dengan tidak adanya ingatan, JVM lebih suka melemparkan kesalahan outofmemoriy daripada mendaur ulang objek seperti itu.
Misalnya, kode berikut:
kelas publik {public static void main (string [] args) {new main (). fun1 (); } public void fun1 () {objek objek = objek baru (); Objek [] objarr = objek baru [1000]; }}Saat berjalan ke objek [] objarr = objek baru [1000]; Saat berjalan ke kalimat ini, jika ada memori yang tidak mencukupi, JVM akan melempar kesalahan OOM dan tidak akan mendaur ulang objek yang ditunjukkan oleh objek. Namun, perlu dicatat bahwa setelah fun1 dijalankan, baik objek maupun objarr tidak ada lagi, sehingga objek yang mereka tunjukkan akan didaur ulang oleh JVM.
Jika Anda ingin mengganggu hubungan antara referensi yang kuat dan objek, Anda dapat menampilkan referensi ke NULL, sehingga JVM akan mendaur ulang objek pada waktu yang tepat.
Softreference
Referensi lunak digunakan untuk menggambarkan beberapa objek yang berguna tetapi tidak diperlukan, dan diwakili dalam Java menggunakan kelas java.lang.ref.softreference. Untuk referensi lunak objek terkait, JVM akan mendaur ulang objek hanya ketika ada memori yang tidak memadai. Oleh karena itu, ini dapat digunakan dengan baik untuk menyelesaikan masalah OOM, dan fitur ini sangat cocok untuk mengimplementasikan caching: seperti caching halaman web, caching gambar, dll.
Referensi lunak dapat digunakan bersama dengan antrian referensi (ReferenceQueue). Jika objek yang dirujuk oleh referensi lunak didaur ulang oleh JVM, referensi lunak akan ditambahkan ke antrian referensi terkait. Berikut adalah contoh penggunaan:
impor java.lang.ref.weakreference; kelas publik {public static void main (string [] args) {weakreference <string> sr = baru loverreference <string> (string baru ("hello")); System.out.println (sr.get ()); System.gc (); // Beri tahu GC JVM untuk pengumpulan sampah System.out.println (sr.get ()); }}Referensi lemah
Referensi yang lemah juga digunakan untuk menggambarkan objek yang tidak penting. Ketika JVM melakukan pengumpulan sampah, objek yang terkait dengan referensi yang lemah akan didaur ulang terlepas dari apakah memori itu cukup. Di Java, gunakan kelas java.lang.ref.weakreference untuk mewakilinya. Berikut adalah contoh penggunaan:
impor java.lang.ref.weakreference; kelas publik {public static void main (string [] args) {weakreference <string> sr = baru loverreference <string> (string baru ("hello")); System.out.println (sr.get ()); System.gc (); // Beri tahu GC JVM untuk pengumpulan sampah System.out.println (sr.get ()); }}Fantomreference
Referensi virtual berbeda dari referensi lunak sebelumnya dan referensi yang lemah, dan mereka tidak mempengaruhi siklus hidup objek. Di Java, gunakan kelas java.lang.ref.phantomreference untuk mewakilinya. Jika suatu objek dikaitkan dengan referensi virtual, itu dapat didaur ulang oleh pengumpul sampah kapan saja, sama seperti tidak ada referensi yang dikaitkan dengannya.
Perlu dicatat bahwa referensi virtual harus digunakan dalam hubungan dengan antrian referensi. Ketika pengumpul sampah sedang bersiap untuk mendaur ulang suatu objek, jika ia menemukan bahwa ia memiliki referensi virtual, ia akan menambahkan referensi virtual ini ke antrian referensi terkait. Program dapat memahami apakah objek yang direferensikan akan dikumpulkan dengan menilai apakah referensi virtual telah ditambahkan ke antrian referensi. Jika program menemukan bahwa referensi virtual telah ditambahkan ke antrian referensi, itu dapat mengambil tindakan yang diperlukan sebelum memori objek yang direferensikan didaur ulang.
Pemahaman lebih lanjut tentang kutipan yang lembut dan lemah
Kami sering menggunakan kutipan yang kuat saat menulis kode. Untuk tiga jenis kutipan lainnya, yang paling umum digunakan adalah kutipan lembut dan kutipan yang lemah. Keduanya memiliki kesamaan dan perbedaan. Mereka semua digunakan untuk menggambarkan objek yang tidak penting, tetapi objek yang terkait dengan referensi lunak hanya akan didaur ulang ketika ada memori yang tidak mencukupi, sedangkan objek yang terkait dengan referensi yang lemah akan selalu didaur ulang ketika JVM dikumpulkan. Mengingat fitur -fitur di atas, referensi lunak cocok untuk caching. Ketika memori tidak cukup, JVM dapat mendaur ulang memori. Referensi yang lemah dapat digunakan untuk mencegah kebocoran memori dalam fungsi panggilan balik. Karena fungsi callback sering merupakan kelas internal anonim dan secara implisit menyimpan referensi ke kelas eksternal, jika fungsi callback dipanggil kembali di utas lain, dan jika kelas eksternal perlu didaur ulang pada saat ini, memori bocor, karena kelas internal anonim menyimpan referensi kuat ke kelas eksternal.
Artikel di atas secara singkat berbicara tentang perbedaan antara empat metode kutipan di Java adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.