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.


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