Bløde referencer i Java

1. Oversigt

I denne hurtige artikel vil vi tale om bløde referencer i Java.

Vi forklarer, hvad de er, hvorfor vi har brug for dem, og hvordan vi opretter dem.

2. Hvad er bløde referencer?

Et blødt referenceobjekt (eller et let tilgængeligt objekt) kan ryddes af affaldssamleren som svar på et hukommelseskrav. Et let tilgængeligt objekt har ingen stærke referencer, der peger på det.

Når en affaldssamler bliver kaldt, begynder den at itere over alle elementer i bunken. GC gemmer referencetypeobjekter i en særlig kø.

Efter at alle objekter i bunken er blevet kontrolleret, bestemmer GC hvilke forekomster der skal fjernes ved at fjerne objekter fra den ovennævnte kø.

Disse regler varierer fra en JVM-implementering til en anden, men det fremgår af dokumentationen alle bløde referencer til objekter, der er let tilgængelige, bliver garanteret ryddet, inden en JVM kaster en OutOfMemoryError.

Der er dog ingen garantier på det tidspunkt, hvor en blød reference bliver ryddet, eller i hvilken rækkefølge et sæt af sådanne referencer til forskellige objekter bliver ryddet.

JVM-implementeringer vælger som regel mellem rengøring af enten nyligt oprettede eller nyligt anvendte referencer.

Objekter, der kan nås let, forbliver i live i nogen tid efter sidste gang, der henvises til dem. Standardværdien er et sekund i levetiden pr. Gratis megabyte i bunken. Denne værdi kan justeres ved hjælp af -XX: SoftRefLRUPolicyMSPerMB flag.

For eksempel for at ændre værdien til 2,5 sekunder (2500 millisekunder) kan vi bruge:

-XX: SoftRefLRUPolicyMSPerMB = 2500

I sammenligning med svage referencer kan bløde referencer have længere levetid, da de fortsætter med at eksistere, indtil der kræves ekstra hukommelse.

Derfor er de et bedre valg, hvis vi har brug for at holde objekter i hukommelsen så længe som muligt.

3. Soft Cases 'brugssager

Bløde referencer kan bruges til implementering af hukommelsesfølsomme cacher hvor hukommelsesstyring er en meget vigtig faktor.

Så længe referenten til en blød reference er stærkt tilgængelig, det vil sige - faktisk er i brug, vil referencen ikke blive ryddet.

En cache kan for eksempel forhindre, at dens senest anvendte poster kasseres ved at holde stærke henvisninger til disse poster, hvilket efterlader de resterende poster, der kasseres efter Garbage Collector's skøn.

4. Arbejde med bløde referencer

I Java er en blød reference repræsenteret af java.lang.ref.SoftReference klasse.

Vi har to muligheder for at initialisere det.

Den første måde er kun at sende en referent:

StringBuilder builder = ny StringBuilder (); SoftReference reference1 = ny SoftReference (builder);

Den anden mulighed indebærer, at man henviser til en java.lang.ref.ReferenceQueue samt en henvisning til en referent. Referencekøer er designet til at gøre os opmærksomme på handlinger udført af Garbage Collector. Det føjer et referenceobjekt til en referencekø, da det beslutter at fjerne referenten til denne reference.

Sådan initialiseres en SoftReference med en ReferenceKue:

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

Som en java.lang.ref.Reference, det indeholder metoderne og klar for at hente og nulstille henholdsvis en referent:

StringBuilder builder1 = reference2.get (); reference2.klar (); StringBuilder builder2 = reference2.get (); // nul 

Hver gang vi arbejder med denne type referencer, skal vi sørge for, at en referent, returneret af , er til stede:

StringBuilder builder3 = reference2.get (); hvis (builder3! = null) {// GC har ikke fjernet forekomsten endnu} ellers {// GC har ryddet forekomsten}

5. Konklusion

I denne vejledning blev vi fortrolige med begrebet bløde referencer og deres brugssager.

Vi har også lært, hvordan man opretter en og arbejder programmatisk med den.