JavaRush /Блоги Java /Random-TG /Тафовут байни истинодҳои заиф, нарм, фантомӣ ва муқаррарӣ...
theGrass
Сатҳи
Саратов

Тафовут байни истинодҳои заиф, нарм, фантомӣ ва муқаррарӣ дар Java

Дар гурӯҳ нашр шудааст
Истинодҳои "заиф" ва истинодҳои "нарм" (WeakReference, SoftReference) кайҳо пеш ба Java API илова карда шуда буданд, аммо на ҳама барномасоз бо онҳо шинос аст. Ин нишон медиҳад, ки холигоҳ дар фаҳмидани он ки дар куҷо ва чӣ тавр истифода бурдани онҳо. Дарсҳои маълумотнома махсусан дар заминаи ҷамъоварии ахлот муҳиманд . Тавре ки ба ҳама маълум аст, худи коллектори партовҳо хотираи ишғолкардаи an objectҳоро озод мекунад, аммо на ҳама барномасозон медонанд, ки он барои озод кардани хотира дар асоси намуди истинодҳои дастрас қарор қабул мекунад. Тафовут байни истинодҳои заиф, нарм, фантомӣ ва муқаррарӣ дар Java - 1Фарқи асосии байни SoftReference ва WeakReference дар он аст, ки коллектор бо онҳо чӣ гуна кор мекунад. Он метавонад ҳар вақт an objectро нест кунад, агар танҳо истинодҳои заиф ба он ишора кунанд, аз тарафи дигар, an objectҳои дорои пайванди нарм танҳо вақте ҷамъ карда мешаванд, ки JVM воқеан ба хотира ниёз дорад. Бинобар ин хусусиятҳои синфҳои истинод, ҳар яки онҳо истифодаи худро доранд. SoftReference метавонад барои татбиқи кэшҳо истифода шавад ва вақте ки JVM ба хотира ниёз дорад, онро тавассути нест кардани чунин an objectҳо озод мекунад. Ва WeakReferences барои нигоҳдории метамаълумотҳо, масалан, нигоҳ доштани истинод ба ClassLoader хеле хубанд. Агар дарсҳо барои боркунӣ вуҷуд надошта бошанд, пас нигоҳ доштани истинод ба ClassLoader маъное надорад , истинодҳои заиф ClassLoader-ро ҳамон лаҳзае, ки мо онро ба ҷои истинодҳои қавӣ таъин мекунем, барои нест кардан дастрас мекунад. Дар ин мақола мо фарқиятҳои байни намудҳои истинод, аз ҷумла истинодҳои қавӣ ва истинодҳои Phantomро дида мебароем .

WeakReference против SoftReference дар Java

Барои онҳое, ки намедонанд, 4 намуди пайвандҳо мавҷуданд:
  1. Истиноди қавӣ
  2. Истиноди заиф
  3. Истиноди мулоим
  4. Reference Phantom
Пайванди қавӣ соддатарин аст, зеро мо онро ҳар рӯз дар барномасозӣ истифода мебарем, масалан, дар code ба монанди String s = "abc" тағирёбандаи s пайванди қавӣ аст. Ҳама гуна ашёе, ки дорои истинодҳои қавӣ аст, аз ҷониби коллектори ахлот хориҷ карда мешавад. Албатта, инҳо an objectҳое ҳастанд, ки барномаи Java лозиманд. Истинодҳои заиф бо синфи java.lang.ref.WeakReference муаррифӣ карда мешаванд , шумо метавонед истинодҳои заифро чунин муайян кунед:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Акнун, вақте ки шумо ҳисобкунаки пурқувватро ба нул (counter = null) таъин мекунед, an objectи дар сатри аввал сохташуда барои ҷамъоварии партовҳо дастрас мешавад, зеро он дигар истинодҳои қавӣ надорад. Истинодҳои slowCounter, ки аз ҷониби Weak сохта шудааст, коллекторро аз нест кардани an objectи Counter пешгирӣ карда наметавонад. Аз тарафи дигар, агар он истинодҳои нарм мебуд, an objectи Counter то он даме, ки JVM ба хотира эҳтиёҷоти махсусан зиёд надошта бошад, нест карда намешавад. Истинодҳои нарм дар Java бо синфи java.lang.ref.SoftReference муаррифӣ карда мешаванд . Намунаи сохтани SoftReference дар Java
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
Пас аз тоза кардани истинодҳои қавӣ (дар сатри 3), дар an objectи Counter танҳо 1 истинодҳои нарм боқӣ мемонад, ки коллектори ахлотро аз нест кардани ин an object пешгирӣ карда наметавонад, аммо бар хилофи истинодҳои заиф, он метавонад қодир бошад ки ин процессро то ба вучуд омадани нарасидани хотираи шадид мавкуф гузорад. Бо назардошти ин фарқияти байни истинодҳои нарм ва истинодҳои заиф, якум барои кэшҳо мувофиқтар аст ва барои метадота заиф аст. Намунаи хуб синфи WeakHashMap аст, ки насли интерфейси Map ба монанди синфҳои HashMap ё TreeMap мебошад , аммо бо як хусусияти фарқкунанда. WeakHashMap калидҳоро ҳамчун истинодҳои заиф мепӯшонад, ки ин маънои онро дорад, ки вақте ки истинодҳои қавӣ ба an object вуҷуд надоранд, истинодҳои заиф, ки дар дохor WeakHashMap ҷойгиранд , шуморо аз коллектори ахлот наҷот намедиҳанд. Истинодҳои фантомӣ навъи сеюми истинодҳо дар бастаи java.lang.ref мебошанд. Истинодҳои Phantom бо синфи java.lang.ref.PhantomReference муаррифӣ карда мешаванд . Объектеро, ки танҳо бо истинодҳои фантомӣ ишора шудааст, коллектор дар вақти дилхоҳ нест кардан мумкин аст. Пайванди Phantom ҳамон тавре ки пайванди заиф ё нарм сохта мешавад.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
Вақте ки шумо истинодҳои қавӣ ба an objectи DigitalCounter-ро тоза мекунед, коллектори ахлот онро дар вақти дилхоҳ нест мекунад, зеро ҳоло танҳо истинодҳои фантомӣ ба он ишора мекунанд. Илова ба синфҳои WeakReference, SoftReference, PhantomReference, WeakHashMap, донистани синфи ReferenceQueue муфид аст . Шумо метавонед ин синфро ҳангоми сохтани an objectи WeakReference, SoftReference ё PhantomReference истифода баред:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Истиноди an object ба ReferenceQueue илова карда мешавад ва шумо метавонед ҳолати истинодҳоро тавассути пурсиши ReferenceQueue назорат кунед. Давраи ҳаёти Объект дар ин диаграмма хуб тасвир шудааст: Тафовут байни истинодҳои заиф, нарм, фантомӣ ва муқаррарӣ дар Java - 2Ин ҳама фарқиятҳои байни истинодҳои заиф ва нарм дар Java аст . Мо инчунин бо истинодҳои фантомӣ, синфи WeakHashMap ва ReferenceQueue шинос шудем . Истифодаи дурусти истинодҳо дар ҷамъоварии ахлот кӯмак мекунад ва ба идоракунии чандирии хотира дар Java оварда мерасонад . Мақолаи аслӣ
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION