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ä.
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").
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ä.
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ä.