Gyenge kapcsolat

A programozásban a gyenge hivatkozás a dinamikusan létrehozott objektumokra való hivatkozás egy speciális típusa hulladékgyűjtéssel vagy hivatkozásszámlálással rendelkező rendszerekben . Az erős hivatkozásoktól abban különbözik, hogy a szemétgyűjtő a törölni kívánt objektumok azonosításakor nem veszi figyelembe a hivatkozás és a halmon lévő objektum kapcsolatát. Így a gyenge hivatkozás lehetővé teszi, hogy egy objektummal úgy dolgozzon, mint egy erős hivatkozás, de ha szükséges, az objektum törlődik, még akkor is, ha gyenge hivatkozás van rá. A közönséges hivatkozásokat néha "erős" hivatkozásoknak nevezik a szemétszállítással összefüggésben.  

A fogalom tartalma

A gyenge hivatkozás fogalma létezik azokban a rendszerekben és programozási nyelvekben , ahol a szemétgyűjtés támogatott - az objektumok automatikus eltávolítása a memóriából , amelyek használata megszűnt, és a továbbiakban nem folytatódik. A szemétgyűjtés tárgyát képező objektumok meghatározásához az elérhetőségi algoritmus egyik vagy másik verzióját használják - egy objektum akkor tekinthető elérhetőnek, ha van legalább egy hivatkozás a programban. Ha egy objektumra egyetlen hivatkozás sem maradt a programban, vagyis az objektum használata megszűnt, akkor az adott objektum a következő megfelelő pillanatban törölhető.

A leírt memóriafelszabadítási mechanizmus bizonyos esetekben memóriaszivárgást generálhat "elfelejtett" hivatkozások miatt, amikor a létrehozott objektumokra vonatkozó hivatkozások több helyen tárolódnak, és amikor az objektumot már nem használják, a programozó nem törli az összeset. A problémák elkerülése érdekében a programozó kénytelen betartani egy meglehetősen merev fegyelmet a hivatkozások használatában, ami nem mindig kényelmes.

Az ehhez hasonló problémák elkerülése érdekében egy programozási nyelv vagy környezet támogathatja az úgynevezett gyenge hivatkozásokat . Az ilyen hivatkozásokat ugyanúgy használják, mint a közönséges hivatkozásokat, de nem befolyásolják a szemétgyűjtést, mivel a hivatkozásszámláló mechanizmus nem veszi figyelembe őket, és az objektum, amelyre ilyen hivatkozások léteznek, törölhető, kivéve, ha vannak szokásos hivatkozások azt (amelyet ebben az összefüggésben "erős kapcsolatoknak" nevezhetünk).

Megvalósítás és használat

A ma már elterjedt szemétgyűjtő programozási nyelvekben, a Java -ban és a C# -ban a gyenge hivatkozások rendszerkönyvtárak szintjén támogatottak. Java-ban a és osztályok szolgálnak erre , C#-ban a . java.lang.ref.WeakReferencejava.lang.ref.SoftReferenceSystem.WeakReference

A gyenge hivatkozások használatának eljárása alapvetően minden rendszerben azonos.

  1. Ha gyenge hivatkozást kell tárolni, egy hivatkozó objektum (az osztály egy példánya WeakReference) jön létre, amely egy normál ("erős") hivatkozást ad át a célobjektumnak. Az átadott erős hivatkozás azonnal felszabadul, és a hivatkozó eltárolja annak másolatát olyan formában, amely nem tudja megakadályozni, hogy a szemétgyűjtő törölje a megfelelő objektumot. Maga a hivatkozó normál objektumként kerül mentésre, vagyis egy szabályos, „erős” hivatkozást kell hozzá menteni.
  2. Ha gyenge hivatkozást kell használni, egy metódust get()(C#-ban tulajdonság ) hív meg a hivatkozó, amely erősTarget hivatkozást hoz létre és visszaad az objektumra, ha az még létezik, vagy nullmutatót ( ), ha az objektum rendelkezik már összegyűjtötték a szemetet. nullnil
  3. Ha a hivatkozó érvényes hivatkozást adott vissza, akkor azt a rendszer az objektum normál módon való elérésére használja. Mivel erősget() referenciát ad vissza , az objektum nem törlődik a használata során. Amikor a használat befejeződött, a hivatkozó által hivatkozott objektum újra elérhetővé válik a szemétgyűjtés számára. Azaz, ha a hivatkozótól kapott erős linket törölték, az objektum új felhasználásához új hivatkozást kell kérni a hivatkozótól, és ellenőrizni kell, hogy az egyenlő-e egy null mutatóval.
  4. Ha a hivatkozó null mutatót adott vissza , az azt jelenti, hogy az objektumot a szemétgyűjtő már eltávolította a hivatkozó időpontjában. A programkódnak ezt a helyzetet az alkalmazás logikájának megfelelően önállóan kell kezelnie. Például gyenge hivatkozások tömbje gyorsítótárként működhet a külső adathordozón tárolt, gyakran elért adatok számára; akkor az objektum gyenge hivatkozás általi elérhetetlensége azt jelenti, hogy be kell tölteni a lemezről vagy a DBMS -ből , és szükség esetén frissíteni kell a gyorsítótár bejegyzését.

A gyenge hivatkozások felhasználási módját a feladat határozza meg. Gyakori gyakorlat az, hogy a gyűjteményekben gyenge hivatkozásokat tárolnak az objektumokra, amelyekre csak addig van szükség, amíg az alkalmazás ezeket az objektumokat használja. Amikor egy objektumra már nincs szükség, és a rá vonatkozó erős hivatkozásokat eltávolítják, a gyűjteményben tárolt gyenge hivatkozások nem akadályozzák meg az objektum eltávolítását a memóriából, így szükségtelenné válik kifejezetten eltávolítani őket a gyűjteményből.

A Java SoftReference osztályának egyik jellemzője, hogy egy objektum törlésekor a szemétgyűjtő figyelembe veszi a hivatkozáson keresztüli elérésének gyakoriságát, ami hasznos lehet például a külső eszközökön - a gyorsítótáron - található adatok gyorsítótárazásához. A gyűjtemény automatikusan tárolja azokat az objektumokat, amelyekhez hosszabb ideig fér hozzá.

Annak megakadályozására, hogy a már nem létező objektumokra való gyenge hivatkozások szennyezzék a memóriát, a rendszerkönyvtárak mechanizmusokat biztosítanak az ilyen hivatkozások figyelembevételére. Ennek a mechanizmusnak egy változata a hivatkozási sorok  – olyan speciális objektumok, amelyeket a létrehozásakor adnak át a hivatkozónak. Amikor a szemétgyűjtő megsemmisíti a gyenge hivatkozással hivatkozott objektumot, hivatkozást helyez el a megfelelő hivatkozásra az előzőleg átadott hivatkozási sorba. Így a „halott” hivatkozásokat tartalmazó hivatkozók listája a program rendelkezésére áll, és bármikor törölheti azokat.

Linkek