JavaRush /Java Blogu /Random-AZ /Java-da zəif, yumşaq, fantom və müntəzəm istinadlar arası...
theGrass
Səviyyə
Саратов

Java-da zəif, yumşaq, fantom və müntəzəm istinadlar arasındakı fərqlər

Qrupda dərc edilmişdir
“Zəif” istinadlar və “yumşaq” istinadlar (WeakReference, SoftReference) çoxdan Java API -yə əlavə edilib , lakin hər proqramçı bunlarla tanış deyil. Bu, onların harada və necə istifadə olunacağını anlamaqda boşluq olduğunu göstərir. İstinad dərsləri zibil toplama kontekstində xüsusilə vacibdir . Hamımızın bildiyimiz kimi, zibil yığan özü obyektlərin tutduğu yaddaşı azad edir, lakin heç də bütün proqramçılar bilmir ki, o, obyekt üçün mövcud olan istinadların növünə əsasən yaddaşı boşaltmaq qərarı verir. SoftReferenceWeakReferenceJava-da zəif, yumşaq, fantom və müntəzəm bağlantılar arasındakı fərqlər - 1 arasındakı əsas fərq kollektorun onlarla necə işləyəcəyidir. O, istənilən vaxt obyekti silə bilər, əgər yalnız zəif keçidlər ona işarə edirsə, digər tərəfdən yumşaq keçidi olan obyektlər yalnız JVM-in həqiqətən yaddaşa ehtiyacı olduqda toplanacaq . İstinad siniflərinin bu xüsusiyyətlərinə görə onların hər birinin öz istifadəsi var. SoftReference keşləri həyata keçirmək üçün istifadə edilə bilər və JVM yaddaşa ehtiyac duyduqda, bu cür obyektləri silməklə onu azad edəcək. Və WeakReferences metadata saxlamaq üçün əladır, məsələn, ClassLoader-ə keçid saxlamaq. Yüklənəcək heç bir sinif yoxdursa, ClassLoader- ə istinad saxlamağın mənası yoxdur , zəif istinad biz onu Güclü istinad əvəzinə təyin etdikdən sonra ClassLoader-i silinmək üçün əlçatan edir. Bu yazıda Güclü istinadPhantom arayışı daxil olmaqla bağlantı növləri arasındakı fərqlərə baxacağıq .

Java-da WeakReference və SoftReference

Bilməyənlər üçün 4 növ keçid var:
  1. Güclü istinad
  2. Zəif istinad
  3. Yumşaq istinad
  4. Fantom Referans
Güclü əlaqə ən sadədir, çünki biz onu hər gün proqramlaşdırmada istifadə edirik, məsələn, String s = “abc” kimi kodda s dəyişəni güclü əlaqədir. Güclü istinadı olan hər hansı obyektin zibil yığan tərəfindən çıxarılması qadağandır. Təbii ki, bunlar Java proqramının ehtiyac duyduğu obyektlərdir . Zəif istinadlar java.lang.ref.WeakReference sinfi ilə təmsil olunur , siz zəif istinadı belə müəyyən edə bilərsiniz:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
İndi güclü istinad sayğacını null (counter = null) olaraq təyin etdikdən sonra birinci sətirdə yaradılmış obyekt artıq güclü istinada malik olmadığı üçün zibil toplama üçün əlçatan olur. Weak tərəfindən yaradılmış zəif sayğac istinadı kollektorun Sayğac obyektini silməsinə mane ola bilməz. Digər tərəfdən, əgər o, Yumşaq istinad olsaydı, JVM-in yaddaşa xüsusi ehtiyacı olana qədər Sayğac obyekti silinməzdi . Java -da yumşaq istinadlar java.lang.ref.SoftReference sinfi ilə təmsil olunur . Java -da SoftReference yaradılması nümunəsi
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üclü istinadı təmizlədikdən sonra (3-cü sətirdə) Sayğac obyektində yalnız 1 yumşaq istinad qalacaq ki, bu da zibil kollektorunun bu obyekti silməsinə mane ola bilməyəcək, lakin zəif istinaddan fərqli olaraq, kəskin yaddaş çatışmazlığı yaranana qədər bu prosesi təxirə salmaq. Yumşaq keçidlər və zəif keçidlər arasındakı bu fərqi nəzərə alsaq, birincisi keşlər üçün daha uyğundur, metadata üçün isə zəifdir. Yaxşı bir nümunə, HashMap və ya TreeMap sinifləri kimi Xəritə interfeysinin nəslindən olan , lakin bir fərqləndirici xüsusiyyəti olan WeakHashMap sinfidir. WeakHashMap açarları zəif istinadlar kimi əhatə edir, yəni obyektə güclü istinadlar olmayan kimi, WeakHashMap daxilində yerləşən zəif istinadlar sizi zibil yığıcıdan xilas etməyəcək. Fantom keçidlər java.lang.ref paketində mövcud olan üçüncü növ bağlantılardır. Fantom istinadları java.lang.ref.PhantomReference sinfi ilə təmsil olunur . Yalnız fantom keçidlərlə işarə edilən obyekt istənilən vaxt kollektor tərəfindən silinə bilər. Phantom linki zəif və ya yumşaq keçid kimi yaradılır.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
DigitalCounter obyektinə güclü istinadları təmizlədikdən sonra zibil kollektor onu istənilən vaxt siləcək, çünki indi yalnız fantom istinadlar ona işarə edir. WeakReference, SoftReference, PhantomReference, WeakHashMap siniflərinə əlavə olaraq ReferenceQueue sinfi haqqında bilmək faydalıdır . Bu sinifdən WeakReference, SoftReference və ya PhantomReference obyekti yaratarkən istifadə edə bilərsiniz:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Obyekt arayışı ReferenceQueue- ə əlavə olunacaq və siz ReferenceQueue-ni sorğulayaraq istinadların vəziyyətinə nəzarət edə bilərsiniz. Obyektin həyat dövrü bu diaqramda yaxşı təsvir edilmişdir: JavaJava-da zəif, yumşaq, fantom və müntəzəm istinadlar arasındakı fərqlər - 2 -da zəif və yumşaq istinadlar arasındakı bütün fərqlər budur . Biz həmçinin fantom bağlantılar, WeakHashMap sinfi və ReferenceQueue ilə tanış olduq . İstinadların düzgün istifadəsi zibilin yığılmasına kömək edəcək və Java -da yaddaşın daha çevik idarə olunması ilə nəticələnəcək . Orijinal məqalə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION