Soft Reference u Javi

1. Pregled

U ovom ćemo kratkom članku govoriti o soft referencama u Javi.

Objasnit ćemo što su, zašto ih trebamo i kako ih stvoriti.

2. Što su meke reference?

Meki referentni objekt (ili objekt koji je lako dostupan) Sakupljač smeća može obrisati kao odgovor na zahtjev za memorijom. Blago dostupni objekt nema na njega jake reference.

Kada se sazove Sakupljač smeća, započinje itiriranje preko svih elemenata u hrpi. GC pohranjuje objekte referentnog tipa u poseban red čekanja.

Nakon što se provjere svi objekti u hrpi, GC određuje koje instance treba ukloniti uklanjanjem objekata iz gore spomenutog reda.

Ta se pravila razlikuju od jedne do druge provedbe JVM-a, ali dokumentacija to navodi sve meke reference na blago dostupne objekte zajamčeno su obrisane prije nego što JVM baci OutOfMemoryError.

Iako se ne daju jamstva za vrijeme kada se meka referenca briše ili redoslijed kojim se skup takvih referenci na različite objekte briše.

U pravilu, JVM implementacije biraju između čišćenja nedavno stvorenih ili nedavno korištenih referenci.

Blago dostupni predmeti ostat će živi neko vrijeme nakon posljednjeg puta na koje se referenciraju. Zadana vrijednost je jedna sekunda života po slobodnom megabajtu na hrpi. Ova se vrijednost može prilagoditi pomoću -XX: SoftRefLRUPolicyMSPerMB zastava.

Na primjer, za promjenu vrijednosti na 2,5 sekunde (2500 milisekundi), možemo koristiti:

-XX: SoftRefLRUPolicyMSPerMB = 2500

U usporedbi sa slabim referencama, meke reference mogu imati dulji vijek trajanja jer i dalje postoje dok se ne zatraži dodatna memorija.

Stoga su bolji izbor ako trebamo objekte držati u sjećanju što je duže moguće.

3. Slučajevi upotrebe mekih referenci

Meke reference mogu se koristiti za implementaciju predmemorija osjetljivih na memoriju gdje je upravljanje memorijom vrlo važan čimbenik.

Sve dok je referentna referenca meke reference jako dostupna, odnosno - zapravo se koristi, referenca se neće obrisati.

Predmemorija može, na primjer, spriječiti odbacivanje njezinih nedavno korištenih unosa zadržavanjem jakih referenci na te unose, a preostale unose ostaviti po odluci Sakupljača smeća.

4. Rad s mekim referencama

U Javi je meka referenca predstavljena znakom java.lang.ref.SoftReference razred.

Imamo dvije mogućnosti da ga inicijaliziramo.

Prvi način je proći samo referent:

StringBuilder builder = novi StringBuilder (); SoftReference reference1 = novi SoftReference (graditelj);

Druga opcija podrazumijeva prosljeđivanje reference na a java.lang.ref.ReferenceQueue kao i referenca na referenta. Referentni redovi osmišljeni su tako da nas upoznaju s radnjama koje obavlja Sakupljač smeća. Dodaje referentni objekt referentnom redu dok odlučuje ukloniti referenca ove reference.

Evo kako pokrenuti a SoftReference s Referentni red:

ReferenceQueue referenceQueue = novi ReferenceQueue (); SoftReference reference2 = novi SoftReference (graditelj, referenceQueue);

Kao java.lang.ref.Reference, sadrži metode dobiti i čisto da biste dobili i resetirali referent:

StringBuilder builder1 = reference2.get (); reference2.clear (); StringBuilder builder2 = reference2.get (); // ništavno 

Svaki put kad radimo s ovom vrstom referenci, moramo osigurati da referent, koji je vratio dobiti, je prisutan:

StringBuilder builder3 = reference2.get (); if (builder3! = null) {// GC još nije uklonio instancu} else {// GC je obrisao instancu}

5. Zaključak

U ovom smo tutorijalu upoznali koncept soft referenci i njihove slučajeve upotrebe.

Također, naučili smo kako ga stvoriti i programski s njim raditi.