8.1 Svage referencer i Java
Der er flere slags referencer i Java.
Der er StrongReference - det er de mest almindelige links, som vi opretter hver dag.
Object object = new Object();//created an object
object = null;//can now be garbage collected
Og der er tre "særlige" typer links - SoftReference, WeakReference, PhantomReference. Faktisk er der kun én forskel mellem alle typer links - GC'ens adfærd med de objekter, de henviser til. Vi vil diskutere detaljerne for hver linktype mere detaljeret senere, men indtil videre vil følgende viden være tilstrækkelig:
- SoftReference er en blød reference, hvis GC'en ser, at et objekt kun er tilgængeligt gennem en kæde af bløde referencer, så vil det fjerne det fra hukommelsen. Måske.
- WeakReference - en svag reference, hvis GC'en ser, at et objekt kun er tilgængeligt gennem en kæde af svage referencer, så vil det fjerne det fra hukommelsen.
- PhantomReference er en fantomreference, hvis GC'en ser, at et objekt kun er tilgængeligt gennem en kæde af fantomreferencer, så vil det fjerne det fra hukommelsen. Efter flere kørsler af GC.
Du kan også sige, at linktyper har en vis grad af blødhed:
- Et almindeligt hårdt link er enhver variabel af en referencetype. Ikke renset op af skraldespanden før den bliver ubrugt.
- SoftReference . Objektet vil ikke få al hukommelse til at blive brugt op - det er garanteret at blive slettet før en OutOfMemoryError opstår. Måske tidligere, afhængig af implementeringen af skraldesamleren.
- Svag reference . Svagere blød. Forhindrer ikke genstanden i at blive bortskaffet; skraldeopsamleren ignorerer sådanne henvisninger.
- PhantomReference . Anvendes til "dødsbehandling" af et objekt: objektet er tilgængeligt efter færdiggørelsen, indtil det er opsamlet affald.
Hvis det endnu ikke er klart, hvad forskellen er, så fortvivl ikke, snart vil alt falde på plads. Detaljerne er i detaljerne, og detaljerne vil følge.
8.2 WeakReference og SoftReference i Java
Lad os først se på forskellen mellem WeakReference og SoftReference i Java.
Kort sagt vil skraldesamleren frigøre et objekts hukommelse, hvis kun svage referencer peger på det. Hvis objektet peges på af SoftReferences, bliver hukommelsen deallokeret, når JVM'en har hårdt brug for hukommelse.
Dette giver en klar fordel for SoftReference frem for Stærk reference i visse tilfælde. For eksempel bruges SoftReference til at implementere en applikationscache, så den første ting, JVM'en vil gøre, er at slette objekter, som kun SoftReferences peger på.
WeakReference er fantastisk til lagring af metadata, såsom lagring af en reference til en ClassLoader. Hvis ingen klasse er indlæst, skal du ikke henvise til ClassLoader. Dette er grunden til, at WeakReference gør det muligt for skraldeopsamleren at udføre sit arbejde på ClassLoader, så snart den sidste stærke reference 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-instansen oprettes på samme måde som i eksemplerne WeakReference og SoftReference, men den bruges sjældent.
En PhantomReference kan indsamles affald, hvis objektet ikke har stærke (Stærk), svage (WeakReference) eller bløde (SoftReference) referencer.
Du kan oprette et Phantom Reference-objekt som dette:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference kan bruges i situationer, hvor finalize() ikke giver mening. Denne referencetype er forskellig fra andre typer, fordi den ikke er designet til at få adgang til et objekt. Det er et signal om, at genstanden allerede er færdiggjort, og skraldemanden er klar til at genvinde sin hukommelse.
For at gøre dette placerer skraldemand det i en særlig referencekø til videre behandling. ReferenceQueue er hvor objektreferencer placeres for at frigøre hukommelse.
Fantomreferencer er en sikker måde at vide, at et objekt er blevet fjernet fra hukommelsen. Overvej for eksempel en applikation, der omhandler store billeder. Lad os sige, at vi vil indlæse et billede i hukommelsen, når det allerede er i hukommelsen, som er klar til affaldsindsamling. I dette tilfælde vil vi vente på, at skraldesamleren dræber det gamle billede, før det indlæses det nye billede i hukommelsen.
Her er PhantomReference et fleksibelt og sikkert valg. Referencen til det gamle billede vil blive sendt til referencekøen, efter at det gamle billedobjekt er ødelagt. Når vi har dette link, kan vi indlæse det nye billede i hukommelsen.