1. Jenis referensi (tidak termasuk referensi yang kuat)
Dapat dipahami bahwa subclass referensi langsung diproses oleh JVM, sehingga tidak berpengaruh secara langsung mewarisi jenis referensi dalam kode. Itu hanya dapat diwarisi dari subkelasnya. Jenis subkelas yang sesuai termasuk yang berikut ini. (Abaikan yang tidak digunakan dalam java, seperti jnireference)
Softreference
Referensi lemah
FinalReference
Fantomreference
Jenis referensi di atas juga disebutkan dalam Javadoc yang sesuai. FinalReference dirancang khusus untuk metode finalisasi, dan ada beberapa skenario aplikasi spesifik lainnya. Di antara mereka, softreference digunakan dalam cache yang berhubungan dengan memori, refreferensi lemah digunakan dalam sebagian besar skenario yang terkait dengan daur ulang. Phantomreference digunakan dalam skenario callback untuk pengemasan objek daur ulang (seperti deteksi kebocoran sumber daya).
Anda dapat secara langsung melihat informasi subkelas dari beberapa jenis di IDE untuk memahami skenario apa yang digunakan dalam sebagian besar kerangka kerja dengan mewarisi tipe yang sesuai, sehingga kami benar -benar dapat melakukan pemrosesan pemilihan jenis.
2. Konstruktor referensi
Ini menyediakan dua konstruktor secara internal, satu dengan antrian dan yang lainnya tanpa antrian. Arti antrian adalah bahwa kita dapat memantau antrian ini secara eksternal. Artinya, jika suatu objek akan didaur ulang, objek referensi yang sesuai akan ditempatkan dalam antrian ini. Saat kami mendapatkan referensi, kami dapat melakukan beberapa transaksi lagi.
Jika tidak, Anda hanya dapat melatih objek referensi secara terus menerus, dan menilai apakah Get Inside Returns Null (objek phantomreference tidak dapat melakukan ini, Get selalu mengembalikan nol, jadi hanya memiliki konstruktor dengan antrian). Kedua metode memiliki skenario penggunaan yang sesuai, tergantung pada aplikasi yang sebenarnya. Misalnya, di WeakHashMap, Anda memilih untuk menanyakan data antrian untuk menentukan apakah ada objek yang akan didaur ulang. Untuk threadlocalmap, digunakan untuk menentukan apakah get () adalah nol untuk diproses.
Konstruktor yang sesuai adalah sebagai berikut:
Referensi (referensi t) {this (referensi, null);} referensi (T referensi, referensiequeue <? Super t> antrian) {this.referent = referensi; this.queue = (antrian == null)? ReferenceQueue.null: antrian;}Antrian nol di sini dapat dipahami sebagai antrian yang tidak memerlukan pemrosesan data dalam antriannya. Dan itu tidak akan mengakses data apa pun di dalamnya.
Pada objek di atas, referensi mewakili objek yang dirujuknya, yaitu objek yang perlu kita bawa ketika kita membangunnya. Definisi bahwa objek akan akan didaur ulang berarti bahwa objek ini tidak memiliki referensi lain kecuali untuk referensi (bukan karena itu tidak benar -benar tidak dirujuk, tetapi aksesibilitas GCroot tidak dapat dijangkau untuk menghindari masalah referensi melingkar).
Antrian adalah antrian yang harus diberitahukan ketika objek didaur ulang. Ketika objek didaur ulang, seluruh objek referensi (bukan objek daur ulang) akan ditempatkan dalam antrian, dan kemudian program eksternal dapat memperoleh data yang sesuai dengan memantau antrian ini.
3. ReferenceQueue dan rantai referensi referensi
Antrian di sini secara nominal adalah antrian, tetapi tidak ada struktur penyimpanan yang sebenarnya di dalamnya. Penyimpanannya tergantung pada hubungan antara node internal. Dapat dipahami bahwa antrian adalah struktur yang mirip dengan daftar yang ditautkan, dan simpul di sini sebenarnya adalah referensi itu sendiri. Dapat dipahami bahwa antrian adalah wadah untuk daftar tertaut, yang hanya menyimpan simpul kepala saat ini, dan node selanjutnya dikelola oleh setiap node referensi sendiri melalui berikutnya.
Nilai status referensi
Setiap objek referensi memiliki deskripsi keadaan yang sesuai, yaitu, itu menggambarkan dirinya dan objek yang dibungkus saat ini, untuk kenyamanan permintaan, penentuan posisi atau pemrosesan.
1. Aktif: Keadaan aktif, yaitu objek yang sesuai adalah keadaan referensi yang kuat dan belum didaur ulang. Dalam keadaan ini, objek tidak akan ditempatkan dalam antrian. Dalam keadaan ini, selanjutnya adalah nol, dan antrian adalah antrian yang dirujuk ketika didefinisikan.
2. Tertunda: Bersiaplah untuk memasukkannya ke dalam antrian. Dalam keadaan ini, objek yang akan diproses akan diantar satu per satu ke dalam antrian. Selama jendela waktu ini, objek yang sesuai berada dalam keadaan tertunda. Tidak peduli referensi apa, jika Anda memasuki keadaan ini, Anda dapat berpikir bahwa dalam keadaan yang sesuai, selanjutnya adalah sendiri (ditetapkan oleh JVM), dan antrian adalah antrian yang dirujuk ketika didefinisikan.
3. Enqueued: Objek yang sesuai sudah didaur ulang, dan objek referensi yang sesuai telah ditempatkan dalam antrian. Utas eksternal siap untuk menanyakan antrian untuk mendapatkan data yang sesuai. Dalam keadaan ini, selanjutnya adalah objek berikutnya yang akan diproses, dan antrian adalah objek identifikasi khusus yang ditetapkan.
4. Tidak aktif: yaitu, objek ini telah diambil dari antrian dari luar dan telah diproses. Itu berarti bahwa objek referensi ini dapat didaur ulang, dan objek yang dienkapsulasi secara internal juga dapat didaur ulang (operasi daur ulang yang sebenarnya tergantung pada apakah tindakan yang jelas disebut). Dapat dipahami bahwa mereka yang memasuki keadaan ini harus didaur ulang.
JVM tidak perlu mendefinisikan nilai negara untuk menentukan status referensi yang sesuai. Ia hanya perlu menghitung selanjutnya dan antrian untuk membuat penilaian.
4. ReferenceQueue#head
Selalu simpan simpul terbaru yang akan diproses dalam antrian saat ini. Anda dapat mempertimbangkan antrian sebagai antrian pertama-keluar terakhir. Ketika simpul baru masuk, logika berikut diadopsi.
newe.next = head; head = newe;
Kemudian, saat memperoleh, gunakan logika yang sesuai
tmp = head; head = tmp.next; return tmp;
V. Referensi#Berikutnya
Artinya, jelaskan node berikutnya yang disimpan oleh simpul referensi yang akan diproses. Tetapi selanjutnya hanya akan masuk akal saat ditempatkan di antrian. Untuk menggambarkan nilai status yang sesuai, setelah ditempatkan di antrian, antriannya tidak akan lagi merujuk pada antrian. Sebaliknya, itu akan merujuk pada enqueued khusus. Karena telah ditempatkan dalam antrian, itu tidak akan ditempatkan di antrian lagi.
6. Referensi#Referensi
Artinya, jelaskan objek aktual yang dirujuk oleh referensi saat ini, yang akan diproses dengan hati -hati sebagaimana dinyatakan dalam anotasi. Artinya, ketika benda ini akan didaur ulang, dan jika didaur ulang, itu akan langsung diatur ke nol, dan program eksternal dapat belajar dari objek referensi itu sendiri (daripada referensi) bahwa perilaku daur ulang terjadi.
7. ReferenceQueue#enqueue yang tertunda referensi enqueue
Proses ini adalah proses objek referensi dari Active-> tertunda-> enqued. Metode ini adalah untuk memproses objek yang menangani keadaan tertunda sebagai keadaan yang diperkenalkan. Proses yang sesuai adalah logika sebelumnya, yaitu, sebuah simpul diikat, dan kode yang sesuai adalah sebagai berikut.
r.queue = enqueued; r.next = (head == null)? r: head = r; queuelength ++; lock.notifyall ();
Nitifikasi terakhir berarti memberi tahu program eksternal yang menghalangi antrian saat ini sebelumnya. (Artinya, objek yang tertunda belum diperoleh sebelumnya)
8. Referensi#Tryhandlepending
Artinya, ini menangani perubahan objek referensi dari keadaan aktif ke keadaan tertunda. Di dalam objek referensi, ada bidang statis, dan deklarasi yang sesuai adalah sebagai berikut:
/* Daftar referensi yang menunggu untuk diaktifkan. Kolektor menambahkan * Referensi ke daftar ini, sedangkan utas Reference-Handler menghapus * mereka. Daftar ini dilindungi oleh objek kunci di atas. Daftar * menggunakan bidang yang ditemukan untuk menautkan elemen -elemennya. */Referensi Statis Privat <Pen Object> tertunda = NULL;
Dapat dipahami bahwa JVM akan menempatkan objek untuk diproses pada bidang statis ini ketika GC. Pada saat yang sama, bidang lain yang ditemukan mewakili objek berikutnya dari objek yang akan diproses. Artinya, dapat dipahami bahwa objek yang akan diproses juga merupakan daftar yang ditautkan. Itu antri melalui penemuan. Anda hanya perlu terus tertunda, dan kemudian terus mendapatkan objek berikutnya melalui penemuan. Karena kedua utas dapat mengakses objek yang tertunda ini, perlu menggunakan pemrosesan kunci.
Proses pemrosesan yang sesuai adalah sebagai berikut:
if (tertunda! = null) {r = tertunda; // 'instanceof' mungkin melempar outofmemoryError kadang-kadang // jadi lakukan ini sebelum tidak mengikat 'r' dari rantai 'tertunda' ... c = r instance dari pembersih? (Pembersih) r: null; // unlink 'r' dari rantai 'tertunda' tertunda = r.discovered; r.discovered = null;} // enqueue objek pemrosesan, yaitu, ia memasuki referencequeue status yang diaktifkan <? objek super> q = r.queue; if (q! = ReferenceQueue.null) q.enqueue (r);9. Referensi#CLEAR
Hapus objek asli yang dirujuk oleh objek referensi, sehingga objek asli tidak dapat lagi diakses melalui metode get (). Dari ide desain yang sesuai, karena telah memasuki objek antrian, itu berarti bahwa objek yang sesuai perlu didaur ulang karena tidak perlu mengakses objek asli lagi. Metode ini tidak akan dipanggil oleh JVM, dan JVM secara langsung menghapus referensi yang sesuai melalui operasi lapangan, dan implementasinya spesifik konsisten dengan metode saat ini.
Semantik Clear adalah untuk membatalkan referensi.
Setelah objek Lemah Referensi memasuki antrian, referensi yang sesuai adalah nol.
Objek Softreference, jika objek tidak memasukkan antrian ketika memori cukup, referensi yang sesuai tidak akan nol. Jika perlu diproses (tidak cukup memori atau kebijakan lain), referensi yang sesuai diatur ke nol dan kemudian masukkan antrian.
Objek FinalReference, karena perlu memanggil objek finalisasi, bahkan jika rujukannya dimasukkan ke dalam antrian, rujukannya tidak akan nol, yaitu, tidak akan dihapus.
Objek phantomreference, karena get itu sendiri diimplementasikan untuk mengembalikan nol, tidak terlalu berguna. Karena tidak akan dibersihkan terlepas dari apakah itu enqueue atau tidak.
10. ReferenceHandler Enqueue Thread
Seperti disebutkan di atas, JVM akan mengatur objek yang akan diproses ke dalam objek yang tertunda, jadi harus ada utas untuk melakukan operasi enqueue kontinu. Utas ini mengacu pada utas prosesor, dan prioritasnya adalah max_priority, yaitu, tertinggi. Proses startup yang sesuai dibuat inisialisasi statis, yang dapat dipahami sebagai ketika objek atau kelas referensi apa pun digunakan, utas ini akan dibuat dan dimulai. Kode yang sesuai adalah sebagai berikut:
static {threadGroup tg = thread.currentThread (). getThreadGroup (); untuk (threadgroup tgn = tg; tgn! = null; tg = tgn, tgn = tg.getParent ()); Handler thread = ReferenceHandler baru (TG, "Reference Handler"); / * Jika ada prioritas khusus sistem khusus yang lebih besar dari * max_priority, itu akan digunakan di sini */ handler.setpriority (thread.max_priority); handler.setdaemon (true); handler.start ();}Prioritasnya adalah yang tertinggi, yang dapat dipahami sebagai kebutuhan untuk terus memproses objek referensi. Saat mencetak utas yang berjalan melalui JStack, pawang referensi yang sesuai mengacu pada utas yang diinisialisasi di sini, seperti yang ditunjukkan di bawah ini:
11. JVM Terkait
Di masing -masing titik pemrosesan di atas, mereka terkait dengan proses daur ulang JVM. Artinya, diyakini bahwa proses GC akan bekerja bersama dengan referensi yang sesuai. Misalnya, menggunakan kolektor CMS, proses Preclean terlibat dalam seluruh proses yang disebutkan di atas, dan pemrosesan komentar Softreference, dll. Pada saat yang sama, berbagai pemrosesan objek referensi juga perlu terkait dengan jenis spesifik. Pemrosesan JVM yang sesuai menggunakan kode C ++, sehingga perlu diurutkan dengan hati -hati.
12. Ringkasan
Seperti objek FinalReference, seluruh referensi dan ReferenceQueue adalah sekelompok kelompok pemrosesan yang bekerja bersama. Untuk memastikan semantik referensi yang berbeda, proses yang terkait dengan JVM GC akhirnya direalisasikan untuk skenario yang berbeda dan tingkat referensi yang berbeda.
Selain itu, karena secara langsung menggunakan ReferenceQueue dan pembukaan utas untuk memantau antrian terlalu merepotkan dan rumit. Anda dapat merujuk ke finalizableReFerenceQueue yang diimplementasikan oleh Google Guava dan objek finalisableReFerence yang sesuai. Proses pemrosesan dapat sedikit disederhanakan. Di atas adalah seluruh konten artikel ini, dan saya harap ini akan membawa bantuan untuk pembelajaran atau pekerjaan semua orang.