JavaRush /Java Blog /Random-TK /Java-da gowşak, ýumşak, fantom we yzygiderli salgylanmala...
theGrass
Dereje
Саратов

Java-da gowşak, ýumşak, fantom we yzygiderli salgylanmalaryň arasyndaky tapawutlar

Toparda çap edildi
“Gowşak” salgylanmalar we “ýumşak” salgylanmalar (WeakReference, SoftReference) Java API-ä öňden goşuldy , ýöne her bir programmist olar bilen tanyş däl. Bu olary nirede we nädip ulanmalydygyna düşünmekdäki boşlugy görkezýär. Hapa ýygnamak nukdaýnazaryndan okuw sapaklary aýratyn möhümdir . Hemmämiziň bilşimiz ýaly, zibil ýygnaýjynyň özi obýektleriň tutýan ýadyny boşadýar, ýöne programmistleriň hemmesi obýekte elýeterli salgylanmalaryň görnüşine baglylykda ýady boşatmak kararyna gelýändigini bilmeýär. “SoftReference” bilen “WeakReference” -iňJava-da gowşak, ýumşak, fantom we yzygiderli salgylanmalaryň arasyndaky tapawutlar - 1 arasyndaky esasy tapawut , kollektoryň olar bilen nähili işlejekdigi. Islendik wagt obýekti diňe gowşak baglanyşyklar görkezýän bolsa pozup biler, beýleki tarapdan, ýumşak baglanyşykly obýektler diňe JVM ýadyna mätäç bolanda ýygnalar. Salgy sapaklarynyň bu aýratynlyklary sebäpli, olaryň hersiniň öz ulanylyşy bar. “SoftReference” keşleri durmuşa geçirmek üçin ulanylyp bilner we JVM ýadyna mätäç bolanda, şular ýaly zatlary pozup boşadar. WeakReferences metadatalary saklamak üçin, mysal üçin, “ClassLoader” -e baglanyşyk saklamak üçin ajaýyp . Loadüklemek üçin synplar ýok bolsa, onda “ClassLoader” -e salgylanmany saklamagyň manysy ýok , gowşak salgylanma “ClassLoader” -i güýçli salgylanmanyň ýerine bellän badymyz aýyrmak üçin elýeterli edýär. Bu makalada güýçli salgylanma we Phantom salgylanmasy ýaly baglanyşyk görnüşleriniň arasyndaky tapawutlara serederis .

Java-da WeakReference vs SoftReference

Bilmeýänler üçin baglanyşyklaryň 4 görnüşi bar:
  1. Güýçli salgylanma
  2. Gowşak salgylanma
  3. Softumşak salgylanma
  4. Phantom salgylanmasy
Güýçli baglanyşyk iň ýönekeý, sebäbi ony her gün programmirlemekde ulanýarys, mysal üçin String s = “abc” ýaly kodda üýtgeýän s güýçli baglanyşykdyr. Güýçli salgylanmasy bolan islendik zadyň hapa ýygnaýjy tarapyndan aýrylmagy gadagan. Elbetde, bular Java programmasynyň zerur zatlary. Gowşak salgylanmalar java.lang.ref.WeakReference synpy bilen görkezilýär , siz şeýle gowşak salgylanmany kesgitläp bilersiňiz:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Indi güýçli salgylanma hasaplaýjysyny null (counter = null) diýip belläniňizden soň, birinji setirde döredilen obýekt zibil ýygnamak üçin elýeterli bolýar, sebäbi indi berk salgylanma ýok. Weak tarapyndan döredilen gowşakCounter salgylanmasy, kollektoryň Counter obýektini pozmagynyň öňüni alyp bilmez. Başga bir tarapdan, ýumşak salgylanma bolan bolsa, JVM ýadyň aýratyn zerurlygy ýüze çykýança Counter obýekti pozulmazdy . Java -da ýumşak salgylanmalar java.lang.ref.SoftReference synpy bilen görkezilýär . Java -da SoftReference döretmegiň mysaly
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
Güýçli salgylanmany arassalandan soň (3-nji setirde), Counter obýektinde diňe 1 sany ýumşak salgylanma galar, bu hapa ýygnaýjynyň bu obýektiň ýok edilmeginiň öňüni alyp bilmez, ýöne gowşak salgylanmadan tapawutlylykda, başarar ýadyň ýiti ýetmezçiligi ýüze çykýança bu prosesi yza süýşürmek. Softumşak baglanyşyklar bilen gowşak baglanyşyklaryň arasyndaky bu tapawudy göz öňünde tutup, birinjisi keşler üçin has amatly, metadata üçin gowşak. Muňa gowy mysal, HashMap ýa-da TreeMap synplary ýaly Karta interfeýsiniň nesli bolan, ýöne bir tapawutly aýratynlygy bolan WeakHashMap synpy . WeakHashMap düwmelerini gowşak salgylanmalar bilen örtýär, bu bir obýekte güýçli salgylanmalar bolmazdan, WeakHashMap- da ýerleşýän gowşak salgylanmalar sizi zibil ýygnaýjydan halas etmejekdigini aňladýar. Phantom baglanyşyklary java.lang.ref paketinde bar bolan baglanyşyklaryň üçünji görnüşidir. Phantom salgylanmalary java.lang.ref.PhantomReference synpy bilen görkezilýär . Diňe fantastiki baglanyşyklar bilen görkezilen obýekt kollektor tarapyndan islendik wagt öçürilip bilner. “Phantom” baglanyşygy gowşak ýa-da ýumşak baglanyşyk ýaly döredilýär.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
“DigitalCounter” obýektine berk salgylanmalary arassalanyňyzdan soň, zibil ýygnaýjy ony islendik wagt ýok eder, sebäbi indi diňe fantastiki salgylanmalar görkezýär. WeakReference, SoftReference, PhantomReference, WeakHashMap sapaklaryndan başga-da, ReferenceQueue synpy barada bilmek peýdalydyr . WeakReference, SoftReference ýa-da PhantomReference obýektini döredeniňizde bu synpy ulanyp bilersiňiz:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Obýekt salgylanmasy “ReferenceQueue” -e goşular we “ReferenceQueue” -e ses bermek arkaly salgylanmalaryň ýagdaýyna gözegçilik edip bilersiňiz. Obýektiň ýaşaýyş sikli bu diagrammada gowy görkezilýär: JavaJava-da gowşak, ýumşak, fantom we yzygiderli salgylanmalaryň arasyndaky tapawutlar - 2 -daky gowşak we ýumşak salgylanmalaryň arasyndaky tapawutlar . Şeýle hem, fantom baglanyşyklary, WeakHashMap synpy we ReferenceQueue bilen tanyşdyk . Salgylary dogry ulanmak zibil ýygnamaga kömek eder we Java -da has çeýe ýady dolandyrar . Asyl makala
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION