JavaRush /Java блогу /Random-KY /Javaдагы алсыз, жумшак, фантомдук жана кадимки шилтемелер...
theGrass
Деңгээл
Саратов

Javaдагы алсыз, жумшак, фантомдук жана кадимки шилтемелердин ортосундагы айырмачылыктар

Группада жарыяланган
"Алсыз" шилтемелер жана "жумшак" шилтемелер (WeakReference, SoftReference) Java API'ге көп убакыт мурун кошулган , бирок ар бир программист алар менен тааныш эмес. Бул аларды кайда жана кантип колдонууну түшүнүүдө боштукту көрсөтүп турат. Шилтеме класстар таштанды чогултуу контекстинде өзгөчө маанилүү . Баарыбызга белгилүү болгондой, таштанды жыйноочу өзү an objectтер ээлеген эстутумду бошотот, бирок бардык эле программисттер ал an objectке жеткorктүү шилтемелердин түрүнө жараша эстутумду бошотуу чечимин чыгарарын бorшпейт. SoftReference жана WeakReferenceJavaдагы алсыз, жумшак, фантомдук жана кадимки шилтемелердин ортосундагы айырмачылыктар - 1 ортосундагы негизги айырма жыйноочу алар менен кантип иштейт. Ал каалаган убакта an objectти өчүрө алат, эгерде ага начар шилтемелер гана бурса, экинчи жагынан, жумшак шилтемеси бар an objectтер JVM чындап эстутумга муктаж болгондо гана чогултулат . Эталондук класстардын ушундай өзгөчөлүктөрүнөн улам алардын ар бири өз алдынча колдонууга ээ. SoftReference кэштерди ишке ашыруу үчүн колдонулушу мүмкүн жана JVM эстутумга муктаж болгондо, мындай an objectтерди жок кылуу менен аны бошотот. Ал эми WeakReferences метадайындарды сактоо үчүн эң сонун, мисалы, ClassLoaderге шилтемени сактоо. Жүктөй турган класстар жок болсо, анда ClassLoader га шилтемени сактоонун кереги жок , начар шилтеме ClassLoader аны Күчтүү шилтеменин ордуна дайындаганыбыз менен аны жок кылууга жеткorктүү кылат. Бул макалада биз шилтемелердин түрлөрүнүн ортосундагы айырмачылыктарды карап чыгабыз, анын ичинде Strong шилтемеси жана Phantom шилтемеси .

Javaдагы WeakReference жана SoftReference

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