JavaRush /Blog Java /Random-MS /Perbezaan antara rujukan lemah, lembut, hantu dan biasa d...
theGrass
Tahap
Саратов

Perbezaan antara rujukan lemah, lembut, hantu dan biasa di Jawa

Diterbitkan dalam kumpulan
Rujukan "Lemah" dan rujukan "lembut" (WeakReference, SoftReference) telah ditambahkan pada API Java sejak dahulu, tetapi tidak setiap pengaturcara biasa dengannya. Ini menunjukkan jurang dalam memahami tempat dan cara menggunakannya. Kelas rujukan amat penting dalam konteks kutipan sampah . Seperti yang kita semua tahu, pengumpul sampah itu sendiri membebaskan memori yang diduduki oleh objek, tetapi tidak semua pengaturcara tahu bahawa ia membuat keputusan untuk membebaskan memori berdasarkan jenis rujukan yang tersedia untuk objek. Perbezaan antara pautan lemah, lembut, hantu dan biasa di Jawa - 1Perbezaan utama antara SoftReference dan WeakReference ialah cara pengumpul akan bekerja dengan mereka. Ia boleh memadamkan objek pada bila-bila masa jika hanya pautan yang lemah menunjuk kepadanya, sebaliknya, objek dengan pautan lembut akan dikumpulkan hanya apabila JVM benar-benar memerlukan ingatan. Oleh kerana ciri-ciri kelas rujukan ini, setiap daripada mereka mempunyai kegunaannya sendiri. SoftReference boleh digunakan untuk melaksanakan cache dan apabila JVM memerlukan memori ia akan membebaskannya dengan memadamkan objek tersebut. Dan WeakReferences bagus untuk menyimpan metadata, contohnya, menyimpan pautan ke ClassLoader. Jika tiada kelas untuk dimuatkan maka tiada gunanya menyimpan rujukan kepada ClassLoader , rujukan yang lemah menjadikan ClassLoader tersedia untuk dialih keluar sebaik sahaja kami menetapkannya dan bukannya rujukan Kuat. Dalam artikel ini kita akan melihat perbezaan antara jenis pautan, termasuk rujukan Kuat dan rujukan Phantom .

WeakReference vs SoftReference dalam Java

Bagi yang tidak tahu, terdapat 4 jenis pautan:
  1. Rujukan yang kukuh
  2. Rujukan Lemah
  3. Rujukan lembut
  4. Rujukan Hantu
Pautan kuat adalah yang paling mudah, kerana kami menggunakannya dalam pengaturcaraan setiap hari, contohnya, dalam kod seperti String s = "abc" pembolehubah s ialah pautan kuat. Mana-mana objek yang mempunyai rujukan yang kuat dilarang dikeluarkan oleh pemungut sampah. Sudah tentu, ini adalah objek yang diperlukan oleh program Java . Rujukan yang lemah diwakili oleh kelas java.lang.ref.WeakReference , anda boleh mentakrifkan rujukan yang lemah seperti ini:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Sekarang, sebaik sahaja anda menetapkan pembilang rujukan kuat kepada null (counter = null), objek yang dibuat dalam baris pertama menjadi tersedia untuk pengumpulan kutipan sampah kerana ia tidak lagi mempunyai rujukan yang kukuh. Rujukan weakCounter yang dibuat oleh Weak tidak boleh menghalang pengumpul daripada memadam objek Counter. Sebaliknya, jika ia adalah rujukan Lembut, objek Counter tidak akan dipadamkan sehingga JVM mempunyai keperluan yang sangat tinggi untuk ingatan. Rujukan lembut dalam Java diwakili oleh kelas java.lang.ref.SoftReference . Contoh mencipta SoftReference dalam Java
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
Selepas mengosongkan rujukan kuat (dalam baris ke-3), hanya 1 rujukan lembut akan kekal pada objek Counter, yang tidak akan dapat menghalang pemungut sampah daripada memadamkan objek ini, tetapi tidak seperti rujukan yang lemah, ia akan dapat menangguhkan proses ini sehingga terdapat kekurangan ingatan yang teruk. Memandangkan perbezaan antara pautan lembut dan pautan lemah ini, yang pertama lebih sesuai untuk cache dan lemah untuk metadata. Contoh yang baik ialah kelas WeakHashMap, yang merupakan keturunan antara muka Peta seperti kelas HashMap atau TreeMap , tetapi dengan satu ciri tersendiri. WeakHashMap membungkus kunci sebagai rujukan yang lemah, yang bermaksud bahawa sebaik sahaja tiada rujukan yang kuat kepada objek, rujukan lemah yang terletak di dalam WeakHashMap tidak akan menyelamatkan anda daripada pengumpul sampah. Pautan hantu ialah jenis pautan ketiga yang tersedia dalam pakej java.lang.ref. Rujukan hantu diwakili oleh kelas java.lang.ref.PhantomReference . Objek yang ditunjuk hanya dengan pautan hantu boleh dipadamkan oleh pengumpul pada bila-bila masa. Pautan Phantom dibuat dengan cara yang sama seperti pautan lemah atau lembut.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
Sebaik sahaja anda mengosongkan rujukan kukuh kepada objek DigitalCounter, pengumpul sampah akan memadamkannya pada bila-bila masa, kerana kini hanya rujukan hantu yang menunjuk kepadanya. Sebagai tambahan kepada kelas WeakReference, SoftReference, PhantomReference, WeakHashMap, adalah berguna untuk mengetahui tentang kelas ReferenceQueue . Anda boleh menggunakan kelas ini apabila mencipta objek WeakReference, SoftReference atau PhantomReference:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Rujukan objek akan ditambahkan pada ReferenceQueue dan anda boleh memantau keadaan rujukan dengan mengundi ReferenceQueue. Kitaran hayat Object diwakili dengan baik dalam rajah ini: Perbezaan antara rujukan lemah, lembut, hantu dan biasa di Jawa - 2Itu sahaja perbezaan antara rujukan lemah dan lembut dalam Java . Kami juga berkenalan dengan pautan hantu, kelas WeakHashMap dan ReferenceQueue . Penggunaan rujukan yang betul akan membantu dengan pengumpulan sampah dan akan menghasilkan pengurusan memori yang lebih fleksibel dalam Java . Artikel asal
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION