JavaRush /Java Blog /Random-ID /Perbedaan antara referensi lemah, lunak, hantu, dan regul...
theGrass
Level 24
Саратов

Perbedaan antara referensi lemah, lunak, hantu, dan reguler di Java

Dipublikasikan di grup Random-ID
Referensi "lemah" dan referensi "lunak" (WeakReference, SoftReference) telah lama ditambahkan ke Java API, tetapi tidak semua programmer mengenalnya. Hal ini menunjukkan adanya kesenjangan dalam pemahaman di mana dan bagaimana menggunakannya. Kelas referensi sangat penting dalam konteks pengumpulan sampah . Seperti yang kita ketahui bersama, pengumpul sampah itu sendiri mengosongkan memori yang ditempati oleh objek, namun tidak semua pemrogram mengetahui bahwa pengumpul sampah membuat keputusan untuk mengosongkan memori berdasarkan jenis referensi yang tersedia untuk objek tersebut. Perbedaan antara referensi lemah, lunak, hantu, dan reguler di Java - 1Perbedaan utama antara SoftReference dan WeakReference adalah cara kolektor bekerja dengannya. Ia dapat menghapus suatu objek kapan saja jika hanya tautan lemah yang menunjuk ke sana, sebaliknya objek dengan tautan lunak akan dikumpulkan hanya ketika JVM benar-benar membutuhkan memori. Karena fitur kelas referensi ini, masing-masing kelas memiliki kegunaannya sendiri. SoftReference dapat digunakan untuk mengimplementasikan cache dan ketika JVM membutuhkan memori, JVM akan membebaskannya dengan menghapus objek tersebut. Dan WeakReferences sangat bagus untuk menyimpan metadata, misalnya, menyimpan tautan ke ClassLoader. Jika tidak ada kelas untuk dimuat maka tidak ada gunanya menyimpan referensi ke ClassLoader , referensi yang lemah membuat ClassLoader tersedia untuk dihapus segera setelah kami menetapkannya alih-alih referensi Kuat. Pada artikel ini kita akan melihat perbedaan antara jenis tautan, termasuk Referensi Kuat dan Referensi Phantom .

WeakReference vs SoftReference di Java

Bagi yang belum tahu, ada 4 jenis link:
  1. Referensi yang kuat
  2. Referensi Lemah
  3. Referensi lembut
  4. Referensi Hantu
Tautan kuat adalah yang paling sederhana, karena kita menggunakannya dalam pemrograman setiap hari, misalnya pada kode seperti String s = “abc” variabel s adalah tautan kuat. Benda apa pun yang mempunyai acuan kuat dilarang dikeluarkan oleh pemulung. Tentu saja, ini adalah objek yang dibutuhkan oleh program Java . Referensi lemah diwakili oleh kelas java.lang.ref.WeakReference , Anda dapat mendefinisikan referensi 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, setelah Anda menyetel penghitung referensi kuat ke null (penghitung = null), objek yang dibuat di baris pertama akan tersedia untuk pengumpulan sampah karena tidak lagi memiliki referensi kuat. Referensi WeakCounter yang dibuat oleh Weak tidak dapat mencegah kolektor menghapus objek Counter. Di sisi lain, jika itu adalah referensi Soft, objek Counter tidak akan dihapus sampai JVM memiliki kebutuhan memori yang sangat tinggi. Referensi lunak di Java diwakili oleh kelas java.lang.ref.SoftReference . Contoh pembuatan SoftReference di 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
Setelah menghapus referensi kuat (di baris ke-3), hanya akan ada 1 referensi lunak yang tersisa pada objek Counter, yang tidak akan dapat mencegah pengumpul sampah menghapus objek ini, tetapi tidak seperti referensi lemah, referensi tersebut akan dapat untuk menunda proses ini sampai terjadi kekurangan memori yang akut. Mengingat perbedaan antara tautan lunak dan tautan lemah, tautan pertama lebih cocok untuk cache, dan lemah untuk metadata. Contoh yang bagus adalah kelas WeakHashMap, yang merupakan turunan dari antarmuka Map seperti kelas HashMap atau TreeMap , tetapi dengan satu fitur yang membedakan. WeakHashMap membungkus kunci sebagai referensi lemah, yang berarti bahwa segera setelah tidak ada referensi kuat ke suatu objek, referensi lemah yang terletak di dalam WeakHashMap tidak akan menyelamatkan Anda dari pengumpul sampah. Tautan hantu adalah jenis tautan ketiga yang tersedia dalam paket java.lang.ref. Referensi Phantom diwakili oleh kelas java.lang.ref.PhantomReference . Sebuah objek yang ditunjuk hanya oleh tautan hantu dapat dihapus oleh kolektor kapan saja. Tautan Phantom dibuat dengan cara yang sama seperti tautan lemah atau lunak.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
Setelah Anda menghapus referensi kuat ke objek DigitalCounter, pengumpul sampah akan menghapusnya kapan saja, karena sekarang hanya referensi hantu yang menunjuk ke objek tersebut. Selain kelas WeakReference, SoftReference, PhantomReference, WeakHashMap, ada gunanya mengetahui tentang kelas ReferrenceQueue . Anda dapat menggunakan kelas ini saat membuat 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);
Referensi objek akan ditambahkan keReferenceQueue dan Anda dapat memantau status referensi dengan melakukan polling padaReferenceQueue. Siklus hidup Object terwakili dengan baik dalam diagram ini: Perbedaan antara referensi lemah, lunak, hantu, dan reguler di Java - 2Itulah perbedaan antara referensi lemah dan lunak di Java . Kami juga mengenal tautan hantu, kelas WeakHashMap , dan RefereeQueue . Menggunakan referensi dengan benar akan membantu pengumpulan sampah dan menghasilkan manajemen memori yang lebih fleksibel di Java . Artikel asli
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION