JavaRush /Java блогы /Random-KK /Java тіліндегі әлсіз, жұмсақ, фантомдық және тұрақты сілт...
theGrass
Деңгей
Саратов

Java тіліндегі әлсіз, жұмсақ, фантомдық және тұрақты сілтемелер арасындағы айырмашылықтар

Топта жарияланған
«Әлсіз» сілтемелер және «жұмсақ» сілтемелер (WeakReference, SoftReference) Java API интерфейсіне көп уақыт бұрын қосылған , бірақ олармен кез келген бағдарламашы таныс емес. Бұл оларды қайда және қалай пайдалану керектігін түсінудегі олқылықты көрсетеді. Анықтамалық сабақтар қоқыс жинау жағдайында ерекше маңызды . Барлығымыз білетіндей, қоқыс жинағыштың өзі an objectілер алып жатқан жадты босатады, бірақ барлық бағдарламашылар ол жадты босату туралы шешімді an objectіге қолжетімді сілтемелер түріне қарай қабылдайтынын білмейді. SoftReference және WeakReferenceJava тіліндегі әлсіз, жұмсақ, фантомдық және тұрақты сілтемелер арасындағы айырмашылықтар - 1 арасындағы негізгі айырмашылық коллектордың олармен жұмыс істеу әдісі болып табылады. Ол an objectіні кез келген уақытта жоя алады, егер оған әлсіз сілтемелер ғана нұсқаса, екінші жағынан жұмсақ сілтемесі бар нысандар JVM шынымен жад қажет болғанда ғана жиналады . Анықтамалық сыныптардың осы ерекшеліктеріне байланысты олардың әрқайсысының өзіндік қолданылуы бар. SoftReference кэштерді іске асыру үшін пайдаланылуы мүмкін және JVM жад қажет болғанда, ол мұндай нысандарды жою арқылы оны босатады. Ал WeakReferences метадеректерді сақтау үшін тамаша, мысалы, ClassLoader сілтемесін сақтау. Жүктелетін сыныптар болмаса, ClassLoader сілтемесін сақтаудың қажеті жоқ , әлсіз сілтеме ClassLoader оны Күшті сілтеменің орнына тағайындаған кезде жою үшін қолжетімді етеді. Бұл мақалада біз сілтеме түрлері арасындағы айырмашылықтарды қарастырамыз, соның ішінде күшті сілтеме және фантом сілтемесі .

Java тіліндегі WeakReference және SoftReference

Білмейтіндер үшін сілтеменің 4 түрі бар:
  1. Күшті сілтеме
  2. Әлсіз анықтама
  3. Жұмсақ анықтама
  4. Фантомдық анықтама
Күшті сілтеме ең қарапайым, өйткені біз оны күн сайын бағдарламалауда қолданамыз, мысалы, String s = “abc” сияқты codeта s айнымалысы күшті сілтеме болып табылады. Күшті сілтемесі бар кез келген нысанды қоқыс жинаушы алып тастауға тыйым салынады. Әрине, бұл Java бағдарламасына қажет an objectілер. Әлсіз сілтемелер 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
Енді күшті сілтеме санауышын null мәніне орнатқаннан кейін (counter = null), бірінші жолда жасалған нысан қоқыс жинау үшін қолжетімді болады, себебі оның күшті сілтемесі жоқ. Weak арқылы жасалған zayıfCounter сілтемесі коллекторға Counter нысанын жоюға кедергі жасай алмайды. Екінші жағынан, егер ол Soft сілтемесі болса, Counter нысаны JVM жадқа ерекше қажеттілік болғанша жойылмайды . Java тіліндегі жұмсақ сілтемелер java.lang.ref.SoftReference сыныбымен ұсынылған . Java тілінде SoftReference құру мысалы
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-жолда) Counter нысанында тек 1 жұмсақ сілтеме қалады, ол қоқыс жинағышқа бұл нысанды жоюға кедергі жасай алмайды, бірақ әлсіз сілтемеден айырмашылығы, ол мүмкін болады. жадтың өткір жетіспеушілігі болғанша бұл процесті кейінге қалдыру. Жұмсақ сілтемелер мен әлсіз сілтемелер арасындағы осы айырмашылықты ескере отырып, біріншісі кэштер үшін қолайлы, ал метадеректер үшін әлсіз. Жақсы мысал ретінде HashMap немесе TreeMap сыныптары сияқты Map интерфейсінің ұрпағы болып табылатын WeakHashMap сыныбы табылады , бірақ бір ерекшелігі бар. WeakHashMap кілттерді әлсіз сілтемелер ретінде орайды, яғни нысанға күшті сілтемелер болмаған кезде, WeakHashMap ішінде орналасқан әлсіз сілтемелер сізді қоқыс жинаушыдан құтқармайды. Фантомдық сілтемелер – java.lang.ref бумасында қолжетімді сілтемелердің үшінші түрі. Фантомдық сілтемелер java.lang.ref.PhantomReference сыныбымен ұсынылған . Фантомдық сілтемелер арқылы ғана көрсетілген нысанды коллектор кез келген уақытта жоя алады. Фантомдық сілтеме әлсіз немесе жұмсақ сілтеме сияқты жасалады.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
DigitalCounter нысанына күшті сілтемелерді жойғаннан кейін, қоқыс жинағыш оны кез келген уақытта жояды, өйткені қазір тек фантомдық сілтемелер оған нұсқайды. WeakReference, SoftReference, PhantomReference, WeakHashMap сыныптарынан басқа, ReferenceQueue сыныбы туралы білу пайдалы . Бұл классты 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);
Нысан сілтемесі ReferenceQueue параметріне қосылады және сіз ReferenceQueue сұрауын сұрау арқылы сілтемелердің күйін бақылай аласыз. Нысанның өмірлік циклі осы диаграммада жақсы көрсетілген: JavaJava тіліндегі әлсіз, жұмсақ, фантомдық және тұрақты сілтемелер арасындағы айырмашылықтар - 2 тіліндегі әлсіз және жұмсақ сілтемелер арасындағы барлық айырмашылықтар осында . Біз сондай-ақ фантомдық сілтемелермен, WeakHashMap класымен және ReferenceQueueмен таныстық . Анықтамаларды дұрыс пайдалану қоқыс жинауға көмектеседі және Java тіліндегі жадты басқарудың икемді болуына әкеледі . Түпнұсқа мақала
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION