Fantomreferanser i Java

1. Oversikt

I denne artikkelen ser vi på begrepet Phantom Reference - på Java-språket.

2. Fantomreferanser

Fantomreferanser har to store forskjeller fra myke og svake referanser.

Vi kan ikke få referent til en fantomreferanse. Referenten er aldri tilgjengelig direkte via API, og det er derfor vi trenger en referansekø for å jobbe med denne typen referanser.

Garbage Collector legger til en fantomreferanse i en referansekø etter at den avsluttende metoden for referenten er utført. Det antyder at forekomsten fremdeles er i minnet.

3. Bruk saker

Det er to vanlige brukssaker de brukes til.

Den første teknikken er for å bestemme når et objekt ble fjernet fra minnet som hjelper til med å planlegge minnesensitive oppgaver. For eksempel kan vi vente på at et stort objekt blir fjernet før vi laster inn et nytt.

Den andre øvelsen er for å unngå å bruke fullføre metode og forbedre sluttprosess.

3.1. Eksempel

La oss nå implementere den andre brukssaken for å finne ut hvordan denne typen referanser fungerer.

For det første trenger vi en underklasse av Fantomreferanse klasse for å definere en metode for å tømme ressurser:

offentlig klasse LargeObjectFinalizer utvider PhantomReference {public LargeObjectFinalizer (Object referent, ReferenceQueue q) {super (referent, q); } offentlig tomrom finalizeResources () {// gratis ressurser System.out.println ("clearing ..."); }}

Nå skal vi skrive en forbedret finkornet finalisering:

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

Først initialiserer vi alle nødvendige objekter: referenceQueue - å holde oversikt over referanser, referanser - å utføre rengjøringsarbeid etterpå, largeObjects - å etterligne en stor datastruktur.

Deretter lager vi disse objektene ved hjelp av Gjenstand og LargeObjectFinalizer klasser.

Før vi kaller Garbage Collector, frigjør vi et stort stykke data manuelt ved å referere til largeObjects liste. Merk at vi brukte en snarvei til Runtime.getRuntime (). Gc () uttalelse for å påkalle søppeloppsamleren.

Det er viktig å vite det System.gc () utløser ikke søppeloppsamling umiddelbart - det er ganske enkelt et hint for JVM å utløse prosessen.

De til loop demonstrerer hvordan du sørger for at alle referanser er etterfulgt - den skrives ut ekte for hver referanse.

Til slutt brukte vi en samtidig som løkke for å avstemme de innhentede referansene og gjøre rengjøringsarbeid for hver av dem.

4. Konklusjon

I denne raske opplæringen introduserte vi Java's fantomreferanser.

Vi lærte hva dette er og hvordan de kan være nyttige i noen enkle og aktuelle eksempler.


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