Mäkké referencie v Jave

1. Prehľad

V tomto rýchlom článku si povieme o mäkkých referenciách v Jave.

Vysvetlíme, čo to je, prečo ich potrebujeme a ako ich vytvoriť.

2. Čo sú mäkké referencie?

Mäkký referenčný objekt (alebo ľahko dosiahnuteľný objekt) môže program Garbage Collector vyčistiť ako odpoveď na požiadavku na pamäť. Mäkko dosiahnuteľný objekt nemá žiadne silné odkazy, ktoré by naň odkazovali.

Keď sa volá Garbage Collector, začne iterovať cez všetky prvky v halde. GC ukladá objekty referenčného typu do špeciálneho frontu.

Po skontrolovaní všetkých objektov v halde GC určí, ktoré inštancie by sa mali odstrániť, odstránením objektov z vyššie spomenutého frontu.

Tieto pravidlá sa líšia od jednej implementácie JVM k druhej, ale dokumentácia to uvádza všetky mäkké odkazy na mäkko dostupné objekty sú zaručene vymazané skôr, ako JVM hodí an OutOfMemoryError.

Nie sú však poskytované žiadne záruky v čase, keď sa vynuluje mäkký odkaz alebo v poradí, v akom sa vymaže množina takýchto odkazov na rôzne objekty.

Implementácie JVM si spravidla vyberajú medzi čistením buď nedávno vytvorených, alebo nedávno použitých referencií.

Mäkko dosiahnuteľné objekty zostanú živé ešte nejaký čas po poslednom použití odkazov. Predvolená hodnota je jedna sekunda životnosti na jeden voľný megabajt v halde. Túto hodnotu je možné upraviť pomocou -XX: SoftRefLRUPolicyMSPerMB vlajka.

Napríklad na zmenu hodnoty na 2,5 sekundy (2 500 milisekúnd) môžeme použiť:

-XX: SoftRefLRUPolicyMSPerMB = 2500

V porovnaní so slabými referenciami môžu mať mäkké referencie dlhšiu životnosť, pretože naďalej existujú, kým sa nevyžaduje dodatočná pamäť.

Preto sú lepšou voľbou, ak potrebujeme uchovať objekty v pamäti čo najdlhšie.

3. Prípady použitia Soft References

Na implementáciu pamätí citlivých na pamäť sa dajú použiť mäkké referencie kde správa pamäte je veľmi dôležitým faktorom.

Pokiaľ je referent mäkkého odkazu silne dosiahnuteľný, to znamená, že je skutočne používaný, referencia nebude vymazaná.

Cache môže napríklad zabrániť tomu, aby jej naposledy použité položky boli zahodené, tým, že na ne ponechá silných referentov, a ponechá zvyšné položky na zahodenie podľa uváženia zberača odpadu.

4. Práca s mäkkými referenciami

V Jave predstavuje mäkký odkaz symbol java.lang.ref.SoftReference trieda.

Máme dve možnosti, ako to inicializovať.

Prvým spôsobom je odovzdať iba referenta:

Staviteľ StringBuilder = nový StringBuilder (); SoftReference reference1 = nový SoftReference (staviteľ);

Druhá možnosť znamená odovzdanie odkazu na a java.lang.ref.ReferenceQueue ako aj odkaz na referenta. Referenčné fronty sú určené na to, aby nás upozornili na činnosti vykonávané nástrojom Garbage Collector. Pripojí referenčný objekt do referenčnej fronty, keď sa rozhodne odstrániť referenta tohto odkazu.

Tu je postup, ako inicializovať a SoftReference s Referenčná fronta:

ReferenceQueue referenceQueue = nový ReferenceQueue (); SoftReference reference2 = nový SoftReference (staviteľ, referenceQueue);

Ako java.lang.ref.referenciaobsahuje metódy dostať a jasný ako získať a resetovať referenta:

StringBuilder builder1 = reference2.get (); reference2.clear (); StringBuilder builder2 = reference2.get (); // nulový 

Zakaždým, keď pracujeme s týmto druhom referencií, musíme sa ubezpečiť, že referent, vrátený dostať, je prítomný:

StringBuilder builder3 = reference2.get (); if (builder3! = null) {// GC inštanciu zatiaľ neodstránil} else {// GC inštanciu vymazal}

5. Záver

V tomto tutoriáli sme sa oboznámili s konceptom mäkkých referencií a ich prípadmi použitia.

Tiež sme sa naučili, ako ho vytvoriť a programovo s ním pracovať.


$config[zx-auto] not found$config[zx-overlay] not found