8.1 Java-da Çydamly Baglanyşyklar
Java-da birnäçe görnüşde baglanyşyklar bar.
StrongReference bar — bular her gün döredýän adaty baglanyşyklar.
Object object = new Object();// obýekti döretdim
object = null;// indi GC tarapyndan ýygnalyp bilner
Üç sany "aýratyn" görnüşli baglanyşyklar hem bar — SoftReference, WeakReference, PhantomReference. Esasan, ähli baglanyşyk görnüşleriniň arasyndaky tapawut diňe bir zada degişlidir — GC bilen olara baglanyşykly obýektleriň özüni alyp baryşy. Her görnüşli baglanyşygyň aýratynlyklaryny soňrak jikme-jik ara alyp maslahatlaşarys, häzir bolsa aşakdaky maglumatlar ýeterlik:
- SoftReference — çydamly baglanyşyk, eger GC görse, obýekt diňe soft baglanyşyklar arkaly elýeterli bolsa, ony ýatdan pozar. Belki.
- WeakReference – gowşak baglanyşyk, eger GC görse, obýekt diňe gowşak baglanyşyklar arkaly elýeterli bolsa, ony ýatdan pozar.
- PhantomReference — phantom baglanyşyk, eger GC görse, obýekt diňe phantom baglanyşyklar arkaly elýeterli bolsa, ony ýatdan pozar. Birnäçe GC işledilenden soň.
Baglanyşyk görnüşleriniň käbir derejede ýumşaklygy hem bar diýip aýdyp bolar:
- Adaty güýçli baglanyşyk – islendik baglanyşyk görnüşli üýtgeýän. Zibil ýygnamasyndan öň ulanylmaz boldy.
- SoftReference. Obýekt ähli pamięt sarp etmez – OutOfMemoryError döräninden öň pozular. Has ir bolup biler, zibil ýygnamagyň ýerine ýetirilişine bagly.
- WeakReference. Çydamlydan gowşak. Obýektiň utylizasiýasyna päsgel bermeýär, zibil ýygnama şeýle baglanyşyklary äsgermezlik edýär.
- PhantomReference. Obýektiň “ölümden öňki” işlenmegi üçin ulanylýar: obýekt finalizasiýadan soň elýeterli, ýöne zibil ýygnama tarapyndan pozulmanka.
Eger nädip tapawut edýändigine düşünmeseňiz, aladalanmaň, tiz wagtdan äşgär bolar. Kiçijik zatlar jikme-jikliklerde, jikme-jiklikler bolsa soň.
8.2 WeakReference we SoftReference Java-da
Ilkibaşda WeakReference we SoftReference Java-da arasyndaky tapawudy göreris.
Gysgaça aýdanyňda, zibil ýygnama gowşak baglanyşyklar diňe görkezýän bolsa obýektiň pamiętasy boşaldylar. SoftReferences baglanyşyklary obýekte görkezýän bolsa, pamięta güwä çykmak, JVM pamięta düýpli mätäç bolanda amala aşyrylýar.
Bu SoftReference belli bir ýagdaýlarda Güýçli baglanyşyga garşy artykmaçlyk berýär. Mysal üçin, SoftReference, programma keşiniň ýerine ýetirilmegi üçin ulanylýar, şonuň üçin JVM SoftReferences diňe görkezýän obýektleri ilkibaşda pozar.
WeakReference metadatalary saklamak üçin ajaýyp, mysal üçin ClassLoader-a baglanyşygy saklamak üçin. Eger hiç hili klass ýüklenerok bolsa, ClassLoader-a baglanyşmaz gerek. Şonuň üçin WeakReference ClassLoader bilen zibil ýygnama işläp biler, diňe soňky güýçli baglanyşyk pozulansoň.
Mysal WeakReference Java-da:
// bir obýekt
Student student = new Student();
// gowşak baglanyşyk
WeakReference
weakStudent = new WeakReference
(student); // indi Student obýekti zibil ýygnama bilen ýygnalyp bilner student = null;
Mysal SoftReference Java-da:
// bir obýekt
Student student = new Student();
// gowşak baglanyşyk
SoftReference
softStudent = new SoftReference
(student) // indi Student obýekti zibil ýygnama bilen ýygnalyp bilner // ýöne bu ýagdaý diňe JVM pamięta çynlakaý mätäç bolanda ýüze çykar student = null;
8.3 PhantomReference Java-da
PhantomReference mysaly WeakReference we SoftReference-de bolşy ýaly döredilýär, ýöne köplenç ulanylmaýar.
PhantomReference zibil ýygnama bilen ýygnanýar, eger obýekte güýçli (Strong), gowşak baglanyşyk (WeakReference) ýa-da çydamly (SoftReference) ýok bolsa.
Phantom Reference obýektini şu şekilde döredip bilersiňiz:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference finalize() ulanmagyň manysyz bolanda ulanylyp bilner. Bu baglanyşyk görnüşi beýleki görnüşlerden tapawutly, sebäbi obýekte girmek üçin niýetlenendir. Ol, obýektiň eýýäm finalizirlenen we zibil ýygnama pamiętasy yzyna berilmeli döwri barada habardyr.
Bu üçin zibil ýygnama ony soňky işlenmek üçin ReferenceQueue-a goýýar. ReferenceQueue — pamięta boşatmak üçin obýektlere baglanyşyklary goýýan ýer.
Phantom baglanyşyklar – obýektiň pamiętadan pozulandygyny bilmegiň howpsuz usulydyr. Mysal üçin, uly suratlar bilen iş salyşýan programma göz öňüne getiriň. Obýekti pamięta ýüklemek isläňizde, zibil ýygnama üçin taýýar pamięta eýýäm ýerleşýändigi uly bolsa. Bu ýagdaýda zibil ýygnama köne suraty pozýança garaşasymyz gelýär we diňe soňra pamięta täze surat ýükleýäris.
Bu ýerde PhantomReference çeýe we howpsuz saýlaw. Köne surata baglanyşyk ReferenceQueue-a goýular, köne suratyň obýekti pozulandan soň. Şu baglanyşykdan soň, biz täze suraty pamięta ýükläp bileris.
GO TO FULL VERSION