Heikko lenkki

Ohjelmoinnissa heikko viittaus on tietyntyyppinen viittaus dynaamisesti luotuihin objekteihin järjestelmissä, joissa on roskakeräys tai viitelaskenta . Se eroaa vahvoista viittauksista siinä, että roskankerääjä ei ota huomioon viitteen ja kasan kohteen suhdetta tunnistaessaan poistettavia kohteita. Näin ollen heikko viittaus antaa sinun työskennellä objektin kanssa kuten vahva viittaus, mutta tarvittaessa objekti poistetaan, vaikka siihen olisi heikko viittaus. Tavallisia viittauksia kutsutaan joskus "vahvoiksi" viittauksiksi jätteenkeräyksen yhteydessä.  

Käsitteen sisältö

Heikon viittauksen käsite on olemassa järjestelmissä ja ohjelmointikielissä , joissa tuetaan roskien keräämistä - sellaisten objektien automaattista poistamista muistista , joiden käyttö on päättynyt eikä sitä enää jatketa. Jätteenkeräyksen kohteena olevien objektien määrittämiseen käytetään yhtä tai toista saavutettavuusalgoritmin versiota - objekti katsotaan saavutettavaksi, jos ohjelmassa on vähintään yksi viite. Kun ohjelmassa ei ole enää yhtään viittausta objektiin, eli kohteen käyttö on päättynyt, tällainen objekti voidaan poistaa seuraavana sopivana hetkenä.

Kuvattu muistin vapauttamismekanismi voi joissain tapauksissa aiheuttaa muistivuotoja "unohdettujen" viittausten takia, kun viittauksia luotuihin objekteihin on tallennettu useaan paikkaan ja kun objektia ei enää käytetä, ohjelmoija ei poista niitä kaikkia. Ongelmien välttämiseksi ohjelmoijan on pakko noudattaa melko tiukkaa kurinalaisuutta linkkien käytössä, mikä ei aina ole kätevää.

Tällaisten ongelmien välttämiseksi ohjelmointikieli tai -ympäristö voi tukea niin kutsuttuja heikkoja viittauksia . Tällaisia ​​viittauksia käytetään samalla tavalla kuin tavallisia viittauksia, mutta ne eivät vaikuta roskien keräämiseen, koska viitteiden laskentamekanismi ei ota niitä huomioon ja objekti, johon viittaukset ovat olemassa, voidaan poistaa, ellei ole tavallisia viittauksia se (jota tässä yhteydessä voidaan kutsua "vahvoiksi linkeiksi").

Toteutus ja käyttö

Nykyään yleisissä roskiin kerätyissä ohjelmointikielissä Java ja C# heikkoja viittauksia tuetaan järjestelmäkirjastojen tasolla. Javassa ja luokat palvelevat tätä , C#:ssa . java.lang.ref.WeakReferencejava.lang.ref.SoftReferenceSystem.WeakReference

Menettely heikkojen viitteiden käyttämiseksi on pohjimmiltaan sama kaikissa järjestelmissä.

  1. Kun heikko viittaus on tallennettava, luodaan viittausobjekti (luokan esiintymä WeakReference), jolle välitetään normaali ("vahva") viittaus kohdeobjektiin. Läpäisty vahva viittaus vapautetaan välittömästi, ja viittaaja tallentaa siitä kopion muodossa, joka ei voi estää roskankerääjää poistamasta vastaavaa objektia. Itse viittaaja tallennetaan tavalliseksi objektiksi, eli siihen on tallennettava tavallinen "vahva" linkki.
  2. Kun vaaditaan heikkoa viittausta, viittaajaan kutsutaan menetelmä get()(C#:ssa ominaisuus ), joka luo ja palauttaa vahvan viittauksen objektiin, jos se on vielä olemassa, tai nollaosoittimen ( ), jos objektilla on roskia on jo kerätty.Target nullnil
  3. Jos viittaaja palautti kelvollisen viitteen, sitä käytetään objektiin pääsemiseen normaalilla tavalla. Koska get()se palauttaa vahvan viittauksen, objektia ei poisteta käytön aikana. Kun sen käyttö on valmis, kohde, johon viittaaja viittaa, tulee jälleen roskien keräyskäyttöön. Eli jos viittaajalta saatu vahva linkki on poistettu, on objektin uutta käyttöä varten hankittava uusi linkki viittaajalta ja tarkistettava, onko se yhtäläinen nollaosoittimeen.
  4. Jos viittaaja palautti tyhjän osoittimen , se tarkoittaa, että roskankerääjä on jo poistanut objektin viittaajan aikaan. Ohjelmakoodin tulee käsitellä tämä tilanne itse sovelluslogiikan mukaisesti. Esimerkiksi joukko heikkoja viittauksia voi toimia välimuistina ulkoiselle medialle tallennetulle usein käytetylle tiedolle; silloin objektin saavuttamattomuus heikon linkin kautta tarkoittaa tarvetta ladata se levyltä tai DBMS :stä ja päivittää tarvittaessa välimuistin merkintä.

Heikkojen viitteiden käyttötapa määräytyy tehtävän mukaan. Yleinen käytäntö on tallentaa kokoelmiin heikkoja viittauksia objekteihin, joita tarvitaan vain niin kauan kuin sovellus käyttää kyseisiä objekteja. Kun objektia ei enää tarvita ja vahvat viittaukset siihen poistetaan, kokoelmaan tallennetut heikot viittaukset eivät estä objektin poistamista muistista, jolloin niitä ei tarvitse erikseen poistaa kokoelmasta.

Javan SoftReference-luokan ominaisuus on se, että roskankerääjä ottaa objektia poistaessaan huomioon sen käyttötiheyden tämän viittauksen kautta, mikä voi olla hyödyllistä esimerkiksi ulkoisissa laitteissa - välimuistissa - olevien tietojen välimuistin toteuttamisessa . kokoelma sisältää automaattisesti ne kohteet, joita käytetään useammin pidempään.

Jotta heikot viittaukset objekteihin, joita ei enää ole, eivät saastuttaisi muistia, järjestelmäkirjastot tarjoavat mekanismeja tällaisten viittausten huomioon ottamiseksi. Tämän mekanismin muunnelma on linkkijonot  – erikoisobjektit, jotka välitetään viittaajalle luonnin yhteydessä. Kun roskankerääjä tuhoaa kohteen, johon heikko viittaus viittaa, se sijoittaa viittauksen vastaavaan viittaajaan aiemmin ohitettuun viitejonoon. Siten lista "kuolleita" linkkejä sisältävistä viittauksista on ohjelman käytettävissä ja se voi poistaa ne milloin tahansa sopivalla hetkellä.

Linkit