Spookverwijzingen in Java

1. Overzicht

In dit artikel zullen we het concept van een Phantom Reference bekijken - in de Java-taal.

2. Fantoomreferenties

Fantoomreferenties hebben twee grote verschillen met zachte en zwakke referenties.

We kunnen geen referent van een fantoomreferentie krijgen. De referent is nooit rechtstreeks toegankelijk via de API en daarom hebben we een referentiewachtrij nodig om met dit soort referenties te werken.

De Garbage Collector voegt een fantoomreferentie toe aan een referentiewachtrij nadat de afrondingsmethode van zijn referent is uitgevoerd. Het impliceert dat de instantie zich nog in het geheugen bevindt.

3. Gebruik gevallen

Er zijn twee veelvoorkomende use-cases waarvoor ze worden gebruikt.

De eerste techniek is om te bepalen wanneer een object uit het geheugen is verwijderd wat helpt bij het plannen van geheugengevoelige taken. We kunnen bijvoorbeeld wachten tot een groot object is verwijderd voordat we een ander laden.

De tweede praktijk is om het gebruik van de afronden methode en verbeter de afrondingsproces.

3.1. Voorbeeld

Laten we nu de tweede use case implementeren om praktisch uit te vinden hoe dit soort referenties werkt.

Ten eerste hebben we een subklasse nodig van de PhantomReference class om een ​​methode te definiëren voor het wissen van bronnen:

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

Nu gaan we een verbeterde, fijnmazige afronding schrijven:

ReferenceQueue referenceQueue = nieuwe ReferenceQueue (); Lijstreferenties = nieuwe ArrayList (); List largeObjects = new ArrayList (); for (int i = 0; i <10; ++ i) {Object largeObject = new Object (); largeObjects.add (largeObject); referenties.add (nieuwe LargeObjectFinalizer (largeObject, referenceQueue)); } largeObjects = null; System.gc (); Referentie referenceFromQueue; voor (PhantomReference-referentie: referenties) {System.out.println (reference.isEnqueued ()); } while ((referenceFromQueue = referenceQueue.poll ())! = null) {((LargeObjectFinalizer) referenceFromQueue) .finalizeResources (); referenceFromQueue.clear (); } 

Eerst initialiseren we alle benodigde objecten: referenceQueue - om in de wachtrij geplaatste referenties bij te houden, referenties - om daarna schoonmaakwerkzaamheden uit te voeren, largeObjects - om een ​​grote datastructuur na te bootsen.

Vervolgens maken we deze objecten met de Voorwerp en LargeObjectFinalizer klassen.

Voordat we de Garbage Collector bellen, maken we handmatig een groot deel van de gegevens vrij door de largeObjects lijst. Merk op dat we een snelkoppeling hebben gebruikt voor de Runtime.getRuntime (). Gc () verklaring om de Garbage Collector aan te roepen.

Het is belangrijk dat te weten Systeem.gc () activeert niet onmiddellijk garbage collection - het is gewoon een hint voor JVM om het proces te activeren.

De voor loop laat zien hoe u ervoor kunt zorgen dat alle referenties in de wachtrij staan ​​- het wordt afgedrukt waar voor elke referentie.

Ten slotte hebben we een terwijl lus om de in de wachtrij geplaatste referenties op te zoeken en voor elk ervan opruimwerk uit te voeren.

4. Conclusie

In deze korte tutorial hebben we Java's fantoomreferenties geïntroduceerd.

We hebben geleerd wat deze zijn en hoe ze nuttig kunnen zijn in enkele eenvoudige en to-the-point voorbeelden.


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