Rujukan Hantu di Jawa

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat konsep Phantom Reference - dalam bahasa Java.

2. Rujukan Hantu

Rujukan hantu mempunyai dua perbezaan utama dari rujukan lembut dan lemah.

Kami tidak boleh mendapatkan rujukan rujukan hantu. Referensi tidak pernah dapat diakses secara langsung melalui API dan inilah sebabnya kami memerlukan barisan rujukan untuk bekerja dengan jenis rujukan ini.

Pengutip Sampah menambah rujukan hantu ke barisan rujukan setelah kaedah akhir dari rujukannya dijalankan . Ini menunjukkan bahawa contohnya masih dalam ingatan.

3. Kes Penggunaan

Terdapat dua kes penggunaan yang biasa digunakan.

Teknik pertama adalah menentukan kapan suatu objek dikeluarkan dari memori yang membantu menjadualkan tugas-tugas yang sensitif pada memori. Sebagai contoh, kita boleh menunggu objek besar dikeluarkan sebelum memuatkan objek lain.

Amalan kedua adalah mengelakkan penggunaan kaedah akhir dan memperbaiki proses penyelesaian .

3.1. Contohnya

Sekarang, mari kita laksanakan kes penggunaan kedua untuk mengetahui bagaimana rujukan seperti ini berfungsi.

Pertama, kita memerlukan subkelas kelas PhantomReference untuk menentukan kaedah untuk membersihkan sumber:

public class LargeObjectFinalizer extends PhantomReference { public LargeObjectFinalizer( Object referent, ReferenceQueue q) { super(referent, q); } public void finalizeResources() { // free resources System.out.println("clearing ..."); } }

Sekarang kita akan menulis penyelesaian akhir yang lebih baik:

ReferenceQueue referenceQueue = new ReferenceQueue(); List references = new ArrayList(); List largeObjects = new ArrayList(); for (int i = 0; i < 10; ++i) { Object largeObject = new Object(); largeObjects.add(largeObject); references.add(new LargeObjectFinalizer(largeObject, referenceQueue)); } largeObjects = null; System.gc(); Reference referenceFromQueue; for (PhantomReference reference : references) { System.out.println(reference.isEnqueued()); } while ((referenceFromQueue = referenceQueue.poll()) != null) { ((LargeObjectFinalizer)referenceFromQueue).finalizeResources(); referenceFromQueue.clear(); } 

Pertama, kita Memulakan semua objek yang diperlukan: referenceQueue - untuk mengesan rujukan enqueued, rujukan - untuk melaksanakan kerja-kerja pembersihan selepas itu, largeObjects - untuk meniru struktur data yang besar.

Seterusnya, kami membuat objek ini menggunakan kelas Object dan LargeObjectFinalizer .

Sebelum memanggil Pemungut Sampah, kami membebaskan sekumpulan data secara manual dengan membatalkan penyenaraian senarai besarObjeks . Perhatikan bahawa kami menggunakan jalan pintas untuk pernyataan Runtime.getRuntime (). Gc () untuk memanggil Pemungut Sampah.

Penting untuk mengetahui bahawa System.gc () tidak segera mencetuskan pengumpulan sampah - ini hanyalah petunjuk agar JVM mencetuskan proses tersebut.

Yang untuk gelung menunjukkan bagaimana untuk memastikan bahawa semua rujukan adalah enqueued - ia akan mencetak benar untuk setiap rujukan.

Akhirnya, kami menggunakan gelung sebentar untuk meninjau rujukan yang dimuatkan dan melakukan kerja pembersihan untuk masing-masing.

4. Kesimpulan

Dalam tutorial ringkas ini, kami memperkenalkan rujukan hantu Java.

Kami belajar apa itu dan bagaimana ia boleh berguna dalam beberapa contoh mudah dan tepat.