Szemétgyűjtő (garbage collector)

JavaScriptben a Java-ból ismert automatikus szemétgyűjtő (garbage collector) szolgáltatás gondoskodik a lefoglalt memóriaterületek felszabadításáról. Ennek tudatában a programozónak a memória felszabadításával nem kell törődnie, az automatikusan bekövetkezik.

A memóriában még létező, de már szükségtelen, elérhetetlen példányokat szemét-nek, garbage nevezzük. A felesleges példányok begyűjtését garbage collecting-nek, vagyis szemétgyűjtésnek. A begyűjtő mechanizmust pedig garbage collector-nak, szemétgyűjtőnek. Ennek általános elterjedt rövidítése a GC.

Azokban a fejlesztési környezetekben, ahol nem létezik Garbage Collector, a program (programozó) felelős az erőforrások felszabadításáért. Általánosságban is elmondható, hogy nem lehet tökéletes az a megoldás, ahol egy szűkös erőforrással (esetünkben a memóriaterülettel) való gazdálkodást maguk az erőforrás felhasználói irányítják.

A GC feladata, hogy az alkalmazás által már nem használható objektumokat azonosítsa. Ha ilyen objektumokat talál, az általuk használt memóriaterületet felszabadítja. A GC-nek természetesen tudnia kell, hogy mely objektumokra nincsen szükség. A szükségtelen objektumok felderítésére használt algoritmus először felépíti az elérhető objektumok gráfját (graph of reachable objects). Ha egy globális változó egy objektumra hivatkozik, akkor az objektumot elérhető objektumnak nevezzük és felkerül az elérhető objektumok gráfjára. Ha egy elérhető objektum egy másikra hivatkozik, akkor az utóbbi is elérhetőnek tekintendő és ez is felkerül a gráfra. Ezzel az algoritmussal mindegyik elérhető objektum felkerül a gráfra. Miután a GC a keresést elvégezte, a gráfnak tartalmaznia kell minden olyan objektumot, amelyek valamilyen módon elérhetőek az alkalmazásból. A gráfon nem szereplő objektumok az alkalmazás számára már nem használhatók, tehát a GC fel fogja szabadítani az általuk elfoglalt memóriaterületet.

A GC memóriakezelése annyira hatékony, hogy a körkörös objektum referencia hivatkozásokkal (circular reference) is képes megbirkózni („mark and sweep” algoritmus).

Körkörös referencia

Körkörös objektum referencia akkor jön létre, ha két objektum kölcsönösen hivatkozik egymásra (A→B→A).