Fantómové odkazy v Jave

1. Prehľad

V tomto článku sa pozrieme na koncept Phantom Reference - v jazyku Java.

2. Fantómové referencie

Fantómové referencie majú dva hlavné rozdiely od mäkkých a slabých referencií.

Nemôžeme dostať referenta fantómovej referencie. Referent nie je nikdy prístupný priamo cez API, a preto potrebujeme referenčnú frontu na prácu s týmto typom referencií.

Garbage Collector pridá fantómový odkaz do referenčného frontu po vykonaní metódy finalizácie jej referenta. Znamená to, že inštancia je stále v pamäti.

3. Používajte puzdrá

Existujú dva bežné prípady použitia, na ktoré sa používajú.

Prvá technika je určiť, kedy bol objekt odstránený z pamäte ktorý pomáha plánovať úlohy citlivé na pamäť. Napríklad môžeme čakať na odstránenie veľkého objektu a až potom načítať ďalší.

Druhá prax je vyhnúť sa použitiu dokončiť metóda a vylepšiť finalizačný proces.

3.1. Príklad

Teraz poďme implementovať druhý prípad použitia, aby sme prakticky zistili, ako tento druh referencií funguje.

Najprv potrebujeme podtriedu PhantomReference triedy na definovanie metódy zúčtovania zdrojov:

public class LargeObjectFinalizer rozširuje PhantomReference {public LargeObjectFinalizer (Object referent, ReferenceQueue q) {super (referent, q); } public void finalizeResources () {// free resources System.out.println ("clearing ..."); }}

Teraz napíšeme vylepšenú jemnozrnnú finalizáciu:

ReferenceQueue referenceQueue = nový ReferenceQueue (); Zoznam referencií = nový ArrayList (); Zoznam largeObjects = new ArrayList (); for (int i = 0; i <10; ++ i) {Object largeObject = new Object (); largeObjects.add (largeObject); reference.add (new LargeObjectFinalizer (largeObject, referenceQueue)); } largeObjects = null; System.gc (); Referenčná referenciaFromQueue; pre (PhantomReference reference: references) {System.out.println (reference.isEnqueued ()); } while ((referenceFromQueue = referenceQueue.poll ())! = null) {((LargeObjectFinalizer) referenceFromQueue) .finalizeResources (); referenceFromQueue.clear (); } 

Najskôr inicializujeme všetky potrebné objekty: referenceQueue - sledovať sledované odkazy, referencie - následne vykonať čistiace práce, largeObjects - napodobniť veľkú dátovú štruktúru.

Ďalej tieto objekty vytvárame pomocou Objekt a LargeObjectFinalizer triedy.

Predtým, ako zavoláme garbage collector, manuálne uvoľníme veľké množstvo dát dereferenciou veľkéObjekty zoznam. Upozorňujeme, že sme použili skratku pre Runtime.getRuntime (). Gc () vyhlásenie na vyvolanie Zberača odpadu.

Je dôležité to vedieť System.gc () nespúšťa okamžite odvoz odpadu - je to iba náznak, aby JVM spustil proces.

The pre slučka ukazuje, ako sa ubezpečiť, že všetky odkazy sú v poradí, vytlačia sa pravda pre každú referenciu.

Nakoniec sme použili a zatiaľ čo slučka, aby ste vylúčili odkazy, ktoré sú v rade, a vykonajte čistenie každého z nich.

4. Záver

V tomto rýchlom návode sme predstavili fantómové odkazy na Javu.

Na niekoľkých jednoduchých a konkrétnych príkladoch sme sa dozvedeli, čo to je a ako môžu byť užitočné.


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