A hivatkozásszámlálás egy olyan technika, amellyel eltárolható a hivatkozások , mutatók vagy leírók száma bizonyos erőforrásokhoz, például objektumokhoz vagy memóriablokkokhoz. Általában olyan objektumok felszabadítására használják, amelyekre már nincs szükség, és amelyekre már nincs hivatkozás.
A hivatkozásszámlálást a szemétgyűjtő algoritmusok egyikeként is ismerik , ahol minden objektum tartalmazza a más objektumok által használt hivatkozások számát . Ha ez a számláló nullára csökken, az azt jelenti, hogy az objektum elérhetetlenné vált, és felkerül a megsemmisítendő objektumok listájára.
Az egyszerű referenciaszámlálás a számláló gyakori frissítését igényli. Amikor egy objektumhivatkozás megsemmisül vagy felülíródik, az objektum hivatkozási száma csökken, és ha az objektum bármely hivatkozását létrehozzák vagy másolják, az objektum hivatkozási száma növekszik.
A referenciaszámlálást lemezes operációs rendszerekben és elosztott rendszerekben is használják, ahol a szemétgyűjtők teljes, nem növekményes követése túl időigényes lenne az összekapcsolt objektumok grafikonjának mérete és a lassú hozzáférési sebesség miatt.
A referenciaszámlálás fő előnye a szemétgyűjtők nyomon követésével szemben, hogy az objektumokat azonnal eltávolítják, amint nem lehet rájuk hivatkozni, és fokozatosan, a gyűjtési ciklusok hosszú szünetei nélkül, és minden objektum egyértelműen meghatározott élettartamával. Valós idejű alkalmazásokban vagy korlátozott memóriával rendelkező rendszerekben ez nagyon fontos a gyors válaszidő fenntartása érdekében. A referenciaszámlálás a szemétgyűjtés megvalósításának egyik legegyszerűbb módja is. Hatékonyan kezeli nemcsak a memóriát, hanem más típusú erőforrásokat is, például operációs rendszer objektumokat, amelyek gyakran sokkal szűkösebbek, mint a memória (a szemétgyűjtési nyomkövetővel rendelkező rendszerek ehhez véglegesítőket használnak , de a késleltetett tisztítás ennek ellenére problémákat okozhat) . A súlyozott referenciaszámok jó megoldást jelentenek az elosztott rendszerekben történő szemétgyűjtéshez.
A hivatkozási számok a különféle futásidejű optimalizálók bemeneteként is hasznosak. Például a megváltoztathatatlan objektumoktól erősen függő rendszerek (sok funkcionális nyelv ) elveszíthetik teljesítményüket a gyakori másolási műveletek miatt. Ha azonban tudjuk, hogy egy objektumnak csak egy hivatkozása van, és ez a kapcsolat elveszik, ugyanakkor egy hasonló új objektum jön létre (mint a karakterlánc hozzáadására vonatkozó kifejezésben str ← str + "a"), akkor ezt a műveletet egy módosítással helyettesíthetjük ( angol mutáció ) eredeti tárgy.
A referenciaszámlálásnak a legegyszerűbb formájában két fő hátránya van a szemétgyűjtés nyomon követéséhez képest , amelyek mindegyikének javítása további mechanizmusokat igényel:
Amikor szemétgyűjtő sémákkal dolgozunk, gyakran célszerű egy link gráfot gondolni , amely egy irányított gráf, ahol a csúcsok objektumok, és ha az A objektum hivatkozást tartalmaz a B objektumra, a csúcsokat az A csúcsból származó él köti össze. Léteznek speciális csúcsok is, amelyek a végrehajtási környezethez (futási környezethez) kapcsolódó helyi változókat vagy hivatkozásokat képviselnek. Az élek soha nem mutatnak ezekre a csúcsokra, de az élek eljuthatnak ezekből a csúcsokból másokhoz.
Ebben az összefüggésben egy objektum legegyszerűbb referenciaszáma egy csúcs bejövő éleinek száma. Egy csúcs törlése az objektum felszabadítását (törlését) jelenti. Egy csúcs törlésére akkor kerül sor, ha a csúcsnak nincs több bejövő éle. Ezért a törlés nem befolyásolja más csúcsok kimenő éleinek számát, de bejövő éleik számát befolyásolhatja, ami viszont a megfelelő objektumok felszabadításához vezethet.