Soft References a Java-ban

1. Áttekintés

Ebben a rövid cikkben puha referenciákról fogunk beszélni a Java-ban.

Elmagyarázzuk, mik ezek, miért van szükségünk rájuk, és hogyan lehet létrehozni őket.

2. Mik a puha hivatkozások?

Egy puha referenciaobjektumot (vagy egy puhán elérhető objektumot) a Garbage Collector törölhet a memóriaigényre válaszul. A lágyan elérhető objektumnak nincsenek rá utaló erős hivatkozásai.

Amikor felhívnak egy szemétgyűjtőt, megkezdi az iterációt a kupac összes elemén. A GC a referencia típusú objektumokat egy speciális sorban tárolja.

Miután a kupacban lévő összes objektum ellenőrzése megtörtént, a GC meghatározza, hogy mely példányokat kell eltávolítani, eltávolítva az objektumokat a fent említett sorból.

Ezek a szabályok JVM-megvalósításonként eltérőek, de a dokumentáció ezt állítja A gyengén hozzáférhető objektumokra vonatkozó összes puha hivatkozás garantáltan törlődik, mielőtt egy JVM dob egy OutOfMemoryError.

Ugyanakkor semmilyen garanciát nem vállalunk arra az időre, amikor egy puha referencia törlődik, vagy annak sorrendjében, amelyben a különböző objektumokra mutató ilyen hivatkozások halmaza törlődik.

Általános szabály, hogy a JVM megvalósításai a közelmúltban létrehozott vagy a közelmúltban használt referenciák tisztítása közül választhatnak.

A lágyan hozzáférhető tárgyak egy ideig még életben maradnak, miután utoljára hivatkoztak rájuk. Az alapértelmezett érték egy másodperc élettartam / szabad megabájt a kupacban. Ez az érték a -XX: SoftRefLRUPolicyMSPerMB zászló.

Például az érték 2,5 másodpercre (2500 ezredmásodpercre) változtatásához használhatjuk:

-XX: SoftRefLRUPolicyMSPerMB = 2500

A gyenge referenciákhoz képest a puha referenciák hosszabb élettartammal bírnak, mivel továbbra is léteznek, amíg további memória nem szükséges.

Ezért jobb választás, ha a lehető leghosszabb ideig tárolnunk kell a tárgyakat a memóriában.

3. Lágy hivatkozások használati esetei

A puha referenciák felhasználhatók a memóriaérzékeny gyorsítótárak végrehajtására ahol a memóriakezelés nagyon fontos tényező.

Amíg a puha referencia referense erősen elérhető, vagyis valóban használatban van, a referencia nem törlődik.

A gyorsítótár például megakadályozhatja a legutóbb használt bejegyzések elvetését azáltal, hogy erős hivatkozásokat tart meg ezekre a bejegyzésekre, a többi bejegyzést pedig a Garbage Collector döntése alapján eldobhatja.

4. Munka puha referenciákkal

A Java-ban egy puha hivatkozást a java.lang.ref.SoftReference osztály.

Két lehetőségünk van az inicializálásra.

Az első út csak egy referens átadása:

StringBuilder builder = új StringBuilder (); SoftReference referencia1 = új SoftReference (készítő);

A második lehetőség azt jelenti, hogy átadunk egy hivatkozást a java.lang.ref.ReferenceQueue valamint hivatkozás egy referensre. A referencia várólistákat arra terveztük, hogy tudatosítsuk bennünket a Garbage Collector által végrehajtott tevékenységekben. Hozzáad egy referenciaobjektumot egy referencia sorhoz, amikor úgy dönt, hogy eltávolítja a referencia referensét.

A következő inicializálása: SoftReference val,-vel Referencia várólista:

ReferenceQueue referenceQueue = új ReferenceQueue (); SoftReference2 = új SoftReference (készítő, referenceQueue);

Mint a java.lang.ref.Reference, tartalmazza a módszereket kap és egyértelmű referens megszerzéséhez és alaphelyzetbe állításához:

StringBuilder builder1 = referencia2.get (); referencia2.tiszta (); StringBuilder builder2 = referencia2.get (); // nulla 

Valahányszor ilyen referenciákkal dolgozunk, meg kell győződnünk arról, hogy egy referens, akit a kap, jelen van:

StringBuilder builder3 = referencia2.get (); if (builder3! = null) {// GC még nem távolította el a példányt} else {// GC törölte a példányt}

5. Következtetés

Ebben az oktatóanyagban megismertük a puha referenciák fogalmát és azok felhasználási eseteit.

Megtanultuk azt is, hogyan kell egyet létrehozni és programozottan dolgozni.