Phantom References in Java
1. Áttekintés
Ebben a cikkben megnézzük a Phantom Reference koncepcióját - Java nyelven.
2. Fantom hivatkozások
A fantom hivatkozásoknak két fő különbség van a puha és gyenge referenciáktól.
Nem kaphatunk fantom hivatkozás referensét. A referens soha nem érhető el közvetlenül az API-n keresztül, és ezért szükségünk van egy referencia sorra, hogy az ilyen típusú referenciákkal dolgozzunk.
A Szemétgyűjtő fantom hivatkozást ad hozzá a referencia sorhoz miután referense véglegesítési metódusát végrehajtották. Ez azt jelenti, hogy a példány még mindig a memóriában van.
3. Használjon tokokat
Két általános használati eset van, amelyekre használják őket.
Az első technika az annak meghatározása, hogy mikor távolítottak el egy objektumot a memóriából amely segít a memóriaérzékeny feladatok ütemezésében. Várhatunk például egy nagy objektum eltávolítását, mielőtt betöltenénk egy másikat.
A második gyakorlat az hogy ne használja a véglegesíteni módszer és javítja a véglegesítési folyamat.
3.1. Példa
Most valósítsuk meg a második felhasználási esetet, hogy gyakorlatilag kitaláljuk, hogyan működnek az ilyen jellegű hivatkozások.
Először is szükségünk van a PhantomReference osztály az erőforrások elszámolásának módszerének meghatározásához:
public class LargeObjectFinalizer kiterjeszti a PhantomReference {public LargeObjectFinalizer (Object referent, ReferenceQueue q) {super (referent, q); } public void finalizeResources () {// szabad források System.out.println ("törlés ..."); }}
Most egy továbbfejlesztett finom szemcsés véglegesítést fogunk írni:
ReferenceQueue referenceQueue = új ReferenceQueue (); Lista hivatkozások = new ArrayList (); List largeObjects = new ArrayList (); for (int i = 0; i <10; ++ i) {Object largeObject = új objektum (); largeObjects.add (largeObject); referenciák.add (új LargeObjectFinalizer (largeObject, referenceQueue)); } largeObjects = null; System.gc (); Referencia referenciaFromQueue; for (PhantomReference referencia: referenciák) {System.out.println (reference.isEnqueued ()); } while ((referenceFromQueue = referenceQueue.poll ())! = null) {((LargeObjectFinalizer) referenceFromQueue) .finalizeResources (); referenceFromQueue.clear (); }
Először az összes szükséges objektumot inicializáljuk: referenceQueue - a felsorolt referenciák nyomon követése, hivatkozások - utólag takarítási munkák elvégzése, nagyobjektumok - nagy adatstruktúra utánzása.
Ezután ezeket az objektumokat a Tárgy és LargeObjectFinalizer osztályok.
Mielőtt felhívnánk a Szemétgyűjtőt, manuálisan felszabadítunk egy nagy mennyiségű adatot a nagyTárgyak lista. Ne feledje, hogy a parancsikonhoz egy parancsikont használtunk Runtime.getRuntime (). Gc () nyilatkozat a szemétgyűjtő meghívására.
Fontos ezt tudni System.gc () nem váltja ki azonnal a szemétszállítást - ez egyszerűen egy tipp a JVM számára a folyamat elindítására.
A mert A loop bemutatja, hogyan lehet megbizonyosodni arról, hogy az összes hivatkozás megjelenik - kinyomtatja igaz minden referenciához.
Végül a míg hurok a lekérdezett referenciák lekérdezéséhez és tisztítási munkák elvégzéséhez mindegyiknél.
4. Következtetés
Ebben a gyors bemutatóban bemutattuk a Java fantom hivatkozásait.
Megtudtuk, mik ezek és hogyan lehetnek hasznosak néhány egyszerű és pontról szóló példában.