Phantom-referencer i Java

1. Oversigt

I denne artikel ser vi på konceptet med en Phantom Reference - på Java-sproget.

2. Phantom-referencer

Fantomreferencer har to store forskelle fra bløde og svage referencer.

Vi kan ikke få en referent til en fantomreference. Referenten er aldrig tilgængelig direkte via API'en, og det er derfor, vi har brug for en referencekø for at arbejde med denne type referencer.

Garbage Collector tilføjer en fantomreference til en referencekø efter færdiggørelsesmetoden for dens referent er udført. Det indebærer, at forekomsten stadig er i hukommelsen.

3. Brug sager

Der er to almindelige brugssager, de bruges til.

Den første teknik er for at bestemme, hvornår et objekt blev fjernet fra hukommelsen som hjælper med at planlægge hukommelsesfølsomme opgaver. For eksempel kan vi vente på, at en stor genstand fjernes, inden vi indlæser en anden.

Den anden praksis er for at undgå at bruge færdiggør metode og forbedre færdiggørelsesproces.

3.1. Eksempel

Lad os nu implementere den anden brugssag for praktisk at finde ud af, hvordan denne type referencer fungerer.

For det første har vi brug for en underklasse af PhantomReference klasse til at definere en metode til clearing af ressourcer:

public class LargeObjectFinalizer udvider PhantomReference {public LargeObjectFinalizer (Object referent, ReferenceQueue q) {super (referent, q); } public void finalizeResources () {// gratis ressourcer System.out.println ("clearing ..."); }}

Nu skal vi skrive en forbedret finkornet færdiggørelse:

ReferenceQueue referenceQueue = ny ReferenceQueue (); Listehenvisninger = ny ArrayList (); Liste largeObjects = ny ArrayList (); for (int i = 0; i <10; ++ i) {Object largeObject = nyt objekt (); largeObjects.add (largeObject); references.add (ny LargeObjectFinalizer (largeObject, referenceQueue)); } largeObjects = null; System.gc (); Reference referenceFromQueue; til (PhantomReference-reference: referencer) {System.out.println (reference.isEnqueued ()); } mens ((referenceFromQueue = referenceQueue.poll ())! = null) {((LargeObjectFinalizer) referenceFromQueue) .finalizeResources (); referenceFromQueue.clear (); } 

For det første initialiserer vi alle nødvendige objekter: referenceKue - at holde styr på henviste referencer referencer - at udføre rengøringsarbejde bagefter largeObjects - at efterligne en stor datastruktur.

Dernæst opretter vi disse objekter ved hjælp af Objekt og LargeObjectFinalizer klasser.

Før vi kalder affaldssamleren, frigør vi manuelt et stort stykke data ved at henvise til largeObjects liste. Bemærk, at vi brugte en genvej til Runtime.getRuntime (). Gc () erklæring om at påberåbe sig affaldssamleren.

Det er vigtigt at vide det System.gc () udløser ikke affaldsopsamling med det samme - det er simpelthen et tip til JVM at udløse processen.

Det til loop demonstrerer, hvordan man sørger for, at alle referencer er indkapslet - den udskrives rigtigt for hver reference.

Endelig brugte vi en mens løkke for at afstemme de indhentede referencer og gøre rengøringsarbejde for hver af dem.

4. Konklusion

I denne hurtige vejledning introducerede vi Java's fantomreferencer.

Vi lærte, hvad disse er, og hvordan de kan være nyttige i nogle enkle og konkrete eksempler.


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