"Hai! Aku mutusake kanggo menehi pelajaran cilik liyane babagan nglumpukake sampah."

Nalika sampeyan wis ngerti, mesin Java dhewe ngawasi nalika obyek dadi rasah, lan mbusak.

"Iya, sampeyan karo Rishi wis ngomong babagan iki. Aku ora ngelingi rincian."

"Oke. Banjur ayo diterusake maneh."

Ngumpulake sampah - 1

"Sanalika obyek digawe, JVM allocates memori kanggo iku. Kapentingan ing obyek dipantau nggunakake variabel referensi.  Obyek bisa dibusak sak uwuh, IE prosedur kang memori dirilis yen ora ana variabel referensi ing obyek. "

"Cerita sethithik babagan tukang sampah - apa iku lan cara kerjane."

"OK. Sampah mbiyen kelakon ing utas utama. Saben 5 menit, utawa liyane asring. Yen ana tau ora cukup memori free, mesin Java bakal nundha kabeh Utas lan mbusak obyek sing ora digunakake."

"Nanging pendekatan iki wis ditinggalake saiki. Pengumpul sampah generasi sabanjure kerja ing mburi layar lan ing benang sing kapisah. Iki diarani koleksi sampah bebarengan."

"Aku weruh. Carane persis kaputusan kanggo mbusak obyek utawa ora digawe?"

"Mung ngetung jumlah referensi menyang obyek ora efektif banget - bisa uga ana obyek sing ngrujuk, nanging ora ana obyek liyane."

"Dadi Jawa njupuk pendekatan sing beda.  Jawa dibagi dadi obyek sing bisa digayuh lan ora bisa digayuh.  Obyek bisa digayuh (urip) yen dirujuk karo obyek liya sing bisa digayuh (urip). , sanajan ora ana sing nyebutake."

"OK. Aku rumangsa ngerti."

"Kepiye kedadeyan pengumpulan sampah sing nyata-pambusakan obyek sing ora perlu?"

"Iku prasaja. Ing Jawa, memori dipérang dadi rong bagéan dening konvènsi, lan nalika iku wektu kanggo sampah koleksi, kabeh urip (digayuh) obyek disalin menyang bagean liyane saka memori, lan memori lawas wis dirilis kabeh.

"Iku pendekatan sing menarik. Ora perlu ngetung referensi: nyalin kabeh obyek sing bisa digayuh, lan kabeh liya sampah."

"Iku rada luwih rumit tinimbang iku. Programer Jawa nemokake manawa obyek biasane dipérang dadi rong kategori: umur dawa (sing ana ing kabeh wektu program mlaku) lan cendhak (sing dibutuhake ing metode lan kanggo nindakake «lokal. "operasi).

"Iku luwih efisien kanggo tetep obyek long-urip kapisah saka short-urip. Kanggo nindakake iki, iku perlu kanggo teka munggah karo cara kanggo nemtokake dhowo umure obyek.

"Dadi, kabeh memori dibagi dadi «generasi». Ana obyek generasi pisanan, obyek generasi kapindho, lan liya-liyane. Saben memori dibusak, counter generasi ditambah 1. Yen obyek tartamtu ana ing pirang-pirang generasi, banjur padha dicathet minangka umur dawa."

"Dina iki, tukang sampah minangka bagean sing rumit lan efisien ing Jawa. Akeh bagean sing bisa digunakake kanthi heuristik-adhedhasar algoritma sing nggawe guesses. Akibaté, asring «ora ngrungokake» pangguna."

"Artine?"

"Jawa nduweni obyek pengumpul sampah ( GC ) sing bisa diarani nggunakake metode System.gc ()."

"Sampeyan uga bisa nggunakake System.runFinalization () kanggo meksa telpon kanggo finalize cara saka obyek sing bakal dibusak. Nanging kasunyatan iku, miturut dokumentasi Jawa, iki njamin ora koleksi sampah bakal miwiti, utawa finalize ( ) cara bakal disebut.  Pengumpul sampah mutusake kapan nelpon lan apa .

"Wah! Apik ngerti."

"Nanging ana liyane. Kaya sing sampeyan ngerti, ing Jawa, sawetara obyek referensi liyane. Jaringan referensi iki digunakake kanggo nemtokake manawa obyek kudu dibusak."

"Lan, deleng. Jawa duwe referensi khusus sing ngidini sampeyan mengaruhi proses iki. Ana kelas bungkus khusus kanggo wong-wong mau. Iki: "

" SoftReference  minangka referensi alus."

" WeakReference  minangka referensi sing lemah."

" PhantomReference minangka referensi phantom."

"Uh... Iki ngelingake aku babagan kelas batin, kelas bersarang, kelas anonim bersarang, lan kelas lokal. Jenenge beda-beda, nanging ora jelas apa tujuane."

"Ngomong, Amigo, sampeyan wis dadi programmer. Saiki sampeyan duka amarga saka jeneng kelas, ngandika «padha ora cukup informatif, lan iku mokal karo siji jeneng (!) kanggo nemtokake apa kelas iki, carane, lan kok"

"Wah. Aku malah ora nggatekake. Nanging ketok banget."

"OK. Cukup tembung. Ayo kula pitutur marang kowe bab SoftReferences."

"Referensi iki dirancang khusus kanggo caching, sanajan bisa digunakake kanggo tujuan liyane-kabeh ing discretion saka programmer."

"Iki conto referensi kasebut:"

Tuladha
// Create a Cat object
Cat cat = new Cat();

// Create a soft reference to a Cat object
SoftReference<Cat> catRef = new SoftReference<Cat>(cat);

// Now only the catRef soft reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the soft reference
catRef.clear();

"Yen mung referensi kanggo obyek sing alus, mula terus urip lan diarani 'alon-alon bisa digayuh'."

"Nanging!  Obyek sing dirujuk mung dening referensi alus bisa dibusak dening kolektor sampah yen program ora duwe memori sing cukup.  Yen dumadakan program ora duwe memori sing cukup, sadurunge mbuwang OutOfMemoryException , kolektor sampah bakal mbusak kabeh obyek. referensi dening referensi alus lan bakal nyoba maneh kanggo nyedhiakke memori kanggo program."

Yen program klien kerep njaluk macem-macem data saka program server. Program server bisa nggunakake SoftReference kanggo cache sawetara. kabeh, ayu!"

"Ya. Aku seneng dhewe."

"Inggih, siji tambahan cilik: Kelas SoftReference duwe rong cara. Metode entuk () ngasilake obyek sing dirujuk dening SoftReference . Yen obyek kasebut dibusak dening kolektor sampah, metode njaluk () bakal miwiti bali null.

"Panganggo uga bisa mbusak SoftReference tegas dening nelpon cetha () cara. Ing kasus iki, link banget ing obyek SoftReference bakal numpes.

"Iku kabeh kanggo saiki."

"Thanks kanggo crita menarik, Ellie. Iku pancene menarik banget."