Phantom reference u Javi

1. Pregled

U ovom ćemo članku pogledati koncept Phantom Reference - na jeziku Java.

2. Fantomske reference

Fantomske reference imaju dvije glavne razlike od mekih i slabih referenci.

Ne možemo dobiti referencu fantomske reference. Referentu nikad nije moguće pristupiti izravno putem API-ja i zato nam je potreban redoslijed referenci za rad s ovom vrstom referenci.

Skupljač smeća dodaje fantomsku referencu na red referenci nakon što se izvrši metoda finalizacije njegovog referenta. To implicira da je instanca još uvijek u memoriji.

3. Koristite slučajeve

Postoje dva uobičajena slučaja upotrebe za koja se koriste.

Prva tehnika je kako bi se utvrdilo kada je neki objekt uklonjen iz memorije što pomaže u rasporedu zadataka osjetljivih na memoriju. Na primjer, možemo pričekati uklanjanje velikog objekta prije nego što učitamo drugi.

Druga praksa je kako bi se izbjeglo korištenje dovršiti metoda i poboljšati postupak finalizacije.

3.1. Primjer

A sada, primijenimo drugi slučaj korištenja kako bismo praktički shvatili kako funkcionira ova vrsta referenci.

Prvo, trebamo podrazred PhantomReference klasa za definiranje metode za brisanje resursa:

javna klasa LargeObjectFinalizer proširuje PhantomReference {javni LargeObjectFinalizer (referent objekta, ReferenceQueue q) {super (referent, q); } javna praznina finalizeResources () {// besplatni resursi System.out.println ("čišćenje ..."); }}

Sada ćemo napisati poboljšanu finozrnatu finalizaciju:

ReferenceQueue referenceQueue = novi ReferenceQueue (); Popis referenci = novi ArrayList (); Navedi largeObjects = novi ArrayList (); za (int i = 0; i <10; ++ i) {Objekt largeObject = novi Object (); largeObjects.add (largeObject); references.add (novi LargeObjectFinalizer (largeObject, referenceQueue)); } largeObjects = null; System.gc (); Referenca referenceFromQueue; za (referenca PhantomReference: reference) {System.out.println (reference.isEnqueued ()); } while ((referenceFromQueue = referenceQueue.poll ())! = null) {((LargeObjectFinalizer) referenceFromQueue) .finalizeResources (); referenceFromQueue.clear (); } 

Prvo inicijaliziramo sve potrebne objekte: referenceQueue - praćenje referenci u redovima, reference - nakon čišćenja, velikiObjekti - oponašati veliku strukturu podataka.

Dalje, stvaramo ove objekte pomoću Objekt i LargeObjectFinalizer razreda.

Prije nego što nazovemo Skupljač smeća, ručno oslobađamo velik dio podataka odbacivanjem reference velikiObjekti popis. Imajte na umu da smo koristili prečac za Runtime.getRuntime (). Gc () izjava za pozivanje Skupljača smeća.

Važno je to znati System.gc () ne pokreće odvoz smeća odmah - to je jednostavno savjet JVM-u da pokrene postupak.

The za petlja pokazuje kako osigurati da su sve reference stavljene u red - ispisat će se pravi za svaku referencu.

Napokon smo upotrijebili a dok petlja za anketiranje referenci u redovima i obavljanje poslova čišćenja svake od njih.

4. Zaključak

U ovom smo brzom uputstvu predstavili Java fantomske reference.

Saznali smo što su to i kako mogu biti korisni u nekoliko jednostavnih i preciznih primjera.


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