Myke referanser i Java

1. Oversikt

I denne raske artikkelen vil vi snakke om myke referanser i Java.

Vi forklarer hva de er, hvorfor vi trenger dem og hvordan vi kan lage dem.

2. Hva er myke referanser?

Et mykt referanseobjekt (eller et lett tilgjengelig objekt) kan fjernes av søppeloppsamleren som svar på et minnebehov. Et mykt tilgjengelig objekt har ingen sterke referanser som peker på det.

Når en søppelsamler blir ringt, begynner den å itere over alle elementene i dyngen. GC lagrer referansetypeobjekter i en spesiell kø.

Etter at alle objekter i dyngen er sjekket, bestemmer GC hvilke forekomster som skal fjernes ved å fjerne objekter fra den køen som er nevnt ovenfor.

Disse reglene varierer fra en JVM-implementering til en annen, men det fremgår av dokumentasjonen alle myke referanser til mykt tilgjengelige gjenstander blir garantert ryddet før en JVM kaster en OutOfMemoryError.

Det gis imidlertid ingen garantier på det tidspunktet når en myk referanse blir ryddet eller rekkefølgen et sett med slike referanser til forskjellige objekter blir ryddet.

Som regel velger JVM-implementeringer mellom rengjøring av nylig opprettede eller nylig brukte referanser.

Objekter som kan nås lett, vil forbli i live i en periode etter siste referanse. Standardverdien er ett sekund av levetiden per gratis megabyte i dyngen. Denne verdien kan justeres ved hjelp av -XX: SoftRefLRUPolicyMSPerMB flagg.

For eksempel, for å endre verdien til 2,5 sekunder (2500 millisekunder), kan vi bruke:

-XX: SoftRefLRUPolicyMSPerMB = 2500

Sammenlignet med svake referanser kan myke referanser ha lengre levetid siden de fortsetter å eksistere til ekstra minne kreves.

Derfor er de et bedre valg hvis vi trenger å holde gjenstander i minnet så lenge som mulig.

3. Myke referanser 'brukstilfeller

Myke referanser kan brukes til implementering av minnesensitive cacher der minnestyring er en veldig viktig faktor.

Så lenge referenten til en myk referanse er sterkt tilgjengelig, det vil si - faktisk er i bruk, vil ikke referansen bli ryddet.

En hurtigbuffer kan for eksempel forhindre at de nylig brukte oppføringene blir kastet ved å beholde sterke referanser til disse oppføringene, slik at de gjenværende oppføringene blir kastet etter søppeloppsamleren.

4. Arbeide med myke referanser

I Java er en myk referanse representert av java.lang.ref.SoftReference klasse.

Vi har to alternativer for å initialisere det.

Den første måten er å bare sende en referent:

StringBuilder builder = new StringBuilder (); SoftReference referanse1 = ny SoftReference (byggmester);

Det andre alternativet innebærer å sende en referanse til a java.lang.ref.ReferenceQueue samt en referanse til en referent. Referansekøer er laget for å gjøre oss oppmerksomme på handlinger utført av søppeloppsamleren. Den legger til et referanseobjekt til en referansekø når det bestemmer seg for å fjerne referenten til denne referansen.

Slik initialiserer du en SoftReference med en Referansekø:

ReferenceQueue referenceQueue = ny ReferenceQueue (); SoftReference reference2 = ny SoftReference (builder, referenceQueue);

Som en java.lang.ref.Referanse, den inneholder metodene og klar for å få og tilbakestille henholdsvis en referent:

StringBuilder builder1 = referanse2.get (); referanse2.klar (); StringBuilder builder2 = referanse2.get (); // null 

Hver gang vi jobber med denne typen referanser, må vi sørge for at en referent, returnert av , er tilstede:

StringBuilder builder3 = referanse2.get (); hvis (builder3! = null) {// GC har ikke fjernet forekomsten ennå} ellers {// GC har fjernet forekomsten}

5. Konklusjon

I denne opplæringen ble vi kjent med konseptet med myke referanser og brukssaker.

Vi har også lært å lage en og jobbe med den programmatisk.


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