8.1 Svaga referenser i Java

Det finns flera typer av referenser i Java.

Det finns StrongReference - det här är de vanligaste länkarna som vi skapar varje dag.

Object object = new Object();//created an object
object = null;//can now be garbage collected

Och det finns tre "speciella" typer av länkar - SoftReference, WeakReference, PhantomReference. Faktum är att det bara finns en skillnad mellan alla typer av länkar - beteendet hos GC med de objekt de refererar till. Vi kommer att diskutera detaljerna för varje länktyp mer i detalj senare, men för nu räcker följande kunskap:

  • SoftReference är en mjuk referens, om GC ser att ett objekt endast är tillgängligt genom en kedja av mjuka referenser, kommer den att ta bort det från minnet. Kanske.
  • WeakReference - en svag referens, om GC ser att ett objekt endast är tillgängligt genom en kedja av svaga referenser, kommer den att ta bort det från minnet.
  • PhantomReference är en fantomreferens, om GC ser att ett objekt endast är tillgängligt genom en kedja av fantomreferenser, kommer den att ta bort det från minnet. Efter flera körningar av GC.

Du kan också säga att länktyper har en viss grad av mjukhet:

  • En vanlig hårdlänk är vilken variabel som helst av en referenstyp. Städas inte upp av sophämtaren innan den blir oanvänd.
  • SoftReference . Objektet kommer inte att göra att allt minne förbrukas - det kommer garanterat att raderas innan ett OutOfMemoryError inträffar. Kanske tidigare, beroende på genomförandet av sopsamlaren.
  • WeakReference . Svagare mjuk. Förhindrar inte att föremålet kasseras; sophämtaren ignorerar sådana referenser.
  • PhantomReference . Används för "dödsbearbetning" av ett objekt: objektet är tillgängligt efter slutförande tills det har samlats upp.

Om det ännu inte är klart vad skillnaden är, oroa dig inte, snart kommer allt att falla på plats. Detaljerna finns i detaljerna, och detaljerna kommer att följa.

8.2 WeakReference och SoftReference i Java

Låt oss först titta på skillnaden mellan WeakReference och SoftReference i Java.

Kort sagt, sopsamlaren kommer att frigöra minnet av ett föremål om bara svaga referenser pekar på det. Om objektet pekas på av SoftReferences, avallokeras minnet när JVM är i stort behov av minne.

Detta ger en klar fördel för SoftReference framför Stark referens i vissa fall. Till exempel används SoftReference för att implementera en applikationscache, så det första som JVM kommer att göra är att ta bort objekt som bara SoftReferences pekar på.

WeakReference är utmärkt för att lagra metadata, som att lagra en referens till en ClassLoader. Om ingen klass laddas, bör du inte hänvisa till ClassLoader. Det är därför WeakReference gör det möjligt för sopsamlaren att utföra sitt arbete på ClassLoader så snart den sista starka referensen till den har tagits bort.

WeakReference exempel i Java:

// some object
Student student = new Student();

// weak reference to it
WeakReference weakStudent = new WeakReference(student);

// now the Student object can be garbage collected
student = null;

SoftReference exempel i Java:

// some object
Student student = new Student();

// weak reference to it
SoftReference softStudent = new SoftReference(student)

// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;

8.3 PhantomReference i Java

PhantomReference-instansen skapas på samma sätt som i exemplen WeakReference och SoftReference, men den används sällan.

En PhantomReference kan samlas in för skräp om objektet inte har starka (Stark), svaga (WeakReference) eller mjuka (SoftReference) referenser.

Du kan skapa ett Phantom Reference-objekt så här:

PhantomReference myObjectRef = new PhantomReference(MyObject);

PhantomReference kan användas i situationer där finalize() inte är vettigt. Denna referenstyp skiljer sig från andra typer eftersom den inte är utformad för att komma åt ett objekt. Det är en signal om att föremålet redan är färdigbehandlat och sopsamlaren är redo att återta sitt minne.

För att göra detta placerar sopsamlaren den i en speciell ReferenceQueue för vidare bearbetning. ReferenceQueue är där objektreferenser placeras för att frigöra minne.

Fantomreferenser är ett säkert sätt att veta att ett objekt har tagits bort från minnet. Tänk till exempel en applikation som hanterar stora bilder. Låt oss säga att vi vill ladda en bild i minnet när den redan finns i minnet, som är redo för sophämtning. I det här fallet vill vi vänta på att sopsamlaren dödar den gamla bilden innan den laddas in i minnet.

Här är PhantomReference ett flexibelt och säkert val. Referensen till den gamla bilden kommer att skickas till ReferenceQueue efter att det gamla bildobjektet har förstörts. När vi har den här länken kan vi ladda den nya bilden i minnet.

undefined
3
Опрос
Working with memory in Java,  18 уровень,  7 лекция
недоступен
Working with memory in Java
Working with memory in Java