8.1 Svake referanser i Java

Det finnes flere typer referanser i Java.

Det er StrongReference - dette er de vanligste lenkene vi lager hver dag.

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

Og det er tre "spesielle" typer lenker - SoftReference, WeakReference, PhantomReference. Faktisk er det bare én forskjell mellom alle typer lenker - oppførselen til GC med objektene de refererer til. Vi vil diskutere detaljene for hver lenketype mer detaljert senere, men foreløpig vil følgende kunnskap være tilstrekkelig:

  • SoftReference er en myk referanse, hvis GC ser at et objekt bare er tilgjengelig gjennom en kjede av myke referanser, vil den fjerne det fra minnet. Kan være.
  • WeakReference - en svak referanse, hvis GC ser at et objekt bare er tilgjengelig gjennom en kjede av svake referanser, vil den fjerne det fra minnet.
  • PhantomReference er en fantomreferanse, hvis GC ser at et objekt bare er tilgjengelig gjennom en kjede av fantomreferanser, vil den fjerne det fra minnet. Etter flere kjøringer med GC.

Du kan også si at lenketyper har en viss grad av mykhet:

  • En vanlig hard link er en hvilken som helst variabel av en referansetype. Ikke ryddet opp av søppelsamleren før den blir ubrukt.
  • SoftReference . Objektet vil ikke føre til at alt minne blir brukt opp - det blir garantert slettet før en OutOfMemoryError oppstår. Kanskje tidligere, avhengig av gjennomføringen av søppelsamleren.
  • Svak referanse . Svakere myk. Hindrer ikke gjenstanden fra å bli kastet; søppeloppsamleren ignorerer slike referanser.
  • PhantomReference . Brukes til "dødsbehandling" av et objekt: objektet er tilgjengelig etter ferdigstillelse til det blir samlet opp søppel.

Hvis det ennå ikke er klart hva forskjellen er, så ikke bekymre deg, snart vil alt falle på plass. Detaljene er i detaljene, og detaljene vil følge.

8.2 WeakReference og SoftReference i Java

La oss først se på forskjellen mellom WeakReference og SoftReference i Java.

Kort sagt vil søppelsamleren frigjøre minnet til et objekt hvis bare svake referanser peker på det. Hvis objektet pekes på av SoftReferences, blir minnet deallokert når JVM har et stort behov for minne.

Dette gir en klar fordel til SoftReference fremfor Sterk referanse i visse tilfeller. For eksempel brukes SoftReference til å implementere en applikasjonsbuffer, så det første JVM vil gjøre er å slette objekter som bare SoftReferences peker på.

WeakReference er flott for å lagre metadata, for eksempel å lagre en referanse til en ClassLoader. Hvis ingen klasse er lastet inn, bør du ikke se ClassLoader. Dette er grunnen til at WeakReference gjør det mulig for søppelsamleren å gjøre sitt arbeid på ClassLoader så snart den siste sterke referansen til den er fjernet.

WeakReference eksempel 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 eksempel 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-forekomsten opprettes på samme måte som i eksemplene WeakReference og SoftReference, men den brukes sjelden.

En PhantomReference kan samles opp hvis objektet ikke har sterke (Strong), svake (WeakReference) eller myke (SoftReference) referanser.

Du kan lage et Phantom Reference-objekt slik:

PhantomReference myObjectRef = new PhantomReference(MyObject);

PhantomReference kan brukes i situasjoner der finalize() ikke gir mening. Denne referansetypen er forskjellig fra andre typer fordi den ikke er designet for å få tilgang til et objekt. Det er et signal om at objektet allerede er ferdigbehandlet og søppelsamleren er klar til å gjenvinne minnet sitt.

For å gjøre dette, plasserer søppelsamleren den i en spesiell ReferenceQueue for videre behandling. ReferenceQueue er der objektreferanser plasseres for å frigjøre minne.

Fantomreferanser er en sikker måte å vite at et objekt er fjernet fra minnet. Vurder for eksempel en applikasjon som omhandler store bilder. La oss si at vi ønsker å laste et bilde inn i minnet når det allerede er i minnet, som er klart for søppelinnsamling. I dette tilfellet ønsker vi å vente på at søppelsamleren dreper det gamle bildet før vi laster det nye bildet inn i minnet.

Her er PhantomReference et fleksibelt og trygt valg. Referansen til det gamle bildet vil bli sendt til ReferenceQueue etter at det gamle bildeobjektet er ødelagt. Når vi har denne koblingen, kan vi laste det nye bildet inn i minnet.

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