Java >> Java opplæring >  >> Java

Forskjellen mellom WeakReference vs SoftReference vs PhantomReference vs Sterk referanse i Java

WeakReference og SoftReference ble lagt til Java API fra lang tid, men ikke alle Java-programmerere er kjent med det. Noe som betyr at det er et gap mellom hvor og hvordan du bruker WeakReference og SoftReference i Java . Referanseklasser er spesielt viktige i sammenheng med hvordan søppelinnsamling fungerer. Som vi alle vet at Garbage Collector gjenvinner minne fra objekter som er kvalifisert for søppelinnsamling, men ikke mange programmerere vet at denne kvalifikasjonen avgjøres basert på hvilken type referanser som peker til det objektet. Dette er også hovedforskjellen mellom WeakReference og SoftReference i Java . Garbage collector kan samle et objekt hvis bare svake referanser peker mot det og de samles ivrig, på den annen side samles Objekter med SoftReference når JVM absolutt trenger minne. Denne spesielle oppførselen til SoftReference og WeakReference gjør dem nyttige i visse tilfeller, f.eks. SoftReference ser perfekt ut for å implementere cacher, så når JVM trenger minne, fjerner den objekter som bare har SoftReference som peker mot dem. På den annen side er WeakReference flott for å lagre metadata, f.eks. lagre ClassLoader-referanse. Hvis ingen klasse lastes inn, er det ingen vits i å beholde referansen til ClassLoader, en WeakReference gjør ClassLoader kvalifisert for søppelinnsamling så snart siste sterke referanse fjernet. I denne artikkelen vil vi utforske litt mer om ulike referanser i Java, f.eks. Sterk referanse og fantomreferanse.

WeakReference vs SoftReference i Java

For de som ikke vet, er det fire typer referanser i Java:

  1. Sterk referanse
  2. Svak referanse
  3. Myk referanse
  4. Phantom Reference

Strong Reference er enklest da vi bruker den i vårt daglige programmeringsliv, f.eks. i koden, String s ="abc" , referansevariabel s har sterk referanse til strengobjekt "abc". Ethvert objekt som har sterk referanse knyttet til seg, er ikke kvalifisert for søppelinnsamling . Dette er åpenbart objekter som trengs av Java-program. Svak referanse er representert ved å bruke java.lang.ref.WeakReference-klassen, og du kan opprette svak referanse ved å bruke følgende kode:

Counter counter = new Counter(); // strong reference - line 1
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection

Så snart du gjør sterk referanseteller =null, blir tellerobjekt opprettet på linje 1 kvalifisert for søppelinnsamling; fordi den ikke har flere Sterk referanse og Svak referanse ved referansevariabel weakCounter kan ikke forhindre at Counter-objekt samles opp. På den annen side, hadde dette vært Soft Reference, blir ikke Counter-objektet samlet inn søppel før JVM absolutt trenger minne. Myk referanse i Java er representert ved å bruke java.lang.ref.SoftReference-klassen. Du kan bruke følgende kode for å lage en SoftReference i Java

Counter prime = new Counter();  // prime holds a strong reference - line 2
SoftReference<Counter> soft = new SoftReference<Counter>(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2

prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory

Etter å ha gjort en sterk referanse null, har Counter-objektet opprettet på linje 2 bare én myk referanse som ikke kan forhindre at den blir samlet inn, men den kan forsinke innsamlingen, noe som er ivrig i tilfelle WeakReference. På grunn av denne store forskjellen mellom SoftReference og WeakReference , SoftReference er mer egnet for cacher og WeakReference er mer egnet for lagring av metadata . Et praktisk eksempel på WeakReference er WeakHashMap, som er en annen implementering av kartgrensesnitt som HashMap eller TreeMap, men med en unik funksjon. WeakHashMap omslutter nøkler som WeakReference, noe som betyr at en gang en sterk referanse til det faktiske objektet er fjernet, forhindrer ikke WeakReference som er tilstede internt på WeakHashMap at de samles inn som søppel.

Fantomreferanse er tredje type referansetype tilgjengelig i java.lang.ref-pakken. Fantomreferanse er representert av java.lang.ref.PhantomReference-klassen. Objekt som bare har Phantom-referanse som peker på dem, kan samles når Garbage Collector liker det. I likhet med WeakReference og SoftReference kan du opprette PhantomReference ved å bruke følgende kode:

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference - line 3
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit); // phantom reference to object created at line 3

digit = null;

Så snart du fjerner Strong reference, kan DigitalCounter-objektet som er opprettet på linje 3, samles opp når som helst, da det bare har én PhantomReference til som peker mot seg, noe som ikke kan forhindre det fra GC.

Bortsett fra å vite om WeakReference, SoftReference, PhantomReference og WeakHashMap er det en annen klasse kalt ReferenceQueue som er verdt å vite. Du kan oppgi en ReferenceQueue-forekomst mens du oppretter en hvilken som helst WeakReference, SoftReference eller PhantomReference som vist i følgende kode:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup

DigitalCounter digit = new DigitalCounter();
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue);

Referanse til forekomst vil bli lagt til ReferenceQueue, og du kan bruke den til å utføre enhver opprydding ved å polle ReferenceQueue. Et objekts livssyklus er pent oppsummert av dette diagrammet.

Det handler om Forskjellen mellom WeakReference og SoftReference i Java . Vi lærte også grunnleggende om referanseklasser f.eks. Svak, myk og fantomreferanse i Java og WeakHashMap og ReferenceQueue. Forsiktig bruk av referanse kan hjelpe Garbage Collection og resultere i bedre minnehåndtering i Java.

Java Tag