GC — esi atkritumu savācējs
Notīri visus objektus, ko saknes vairs nesasniedz, pirms kaudze piepildās. Atbrīvot dzīvu nozīmē segfault. Spēle par sasniedzamību.
Tu esi atkritumu savācējs. Notīri visu, ko saknes vairs nesasniedz.
Kā spēlēt
- Oranžie objekti ir saknes — lokālie un globālie mainīgie. Tie vienmēr ir dzīvi.
- Objekts ir dzīvs, ja vari to sasniegt, sekojot atsaucēm no kādas saknes. Viss pārējais ir atkritumi.
- Klikšķini uz atkritumiem, pirms beidzas laiks. Uzklikšķini kaut kam vēl sasniedzamam, un esi atbrīvojis dzīvu atmiņu — segfault, spēle beigusies.
Kā tas darbojas
Uz kaudzes parādās objekti ar atsaucēm starp tiem. Oranžie ir saknes — lokālie un globālie mainīgie — un viss, ko vari sasniegt, sekojot atsaucēm no saknes, ir dzīvs. Pārējais ir atkritumi, kas jānotīra, pirms beidzas laiks. Uzklikšķini dzīvam objektam, un esi atbrīvojis atmiņu, uz kuru vēl kaut kas norāda: segfault. No 3. viļņa mirušie objekti atsaucas viens uz otru ciklos — tieši tas gadījums, ko atsauču skaitīšana nespēj atbrīvot.
Spēle par sasniedzamības likumu izsekojošo savācēju pamatā. Īsti savācēji risina arī paaudzes, rakstīšanas barjeras un vienlaicīgumu.
Biežāk uzdotie jautājumi
Kā spēle nosaka, kas ir atkritumi?
Pēc sasniedzamības, ko rēķina uz vietas: tā seko atsaucēm no katras saknes un atzīmē atrasto. Neatzīmētais ir atkritumi. Tā ir tieši mark-and-sweep atzīmēšanas fāze.
Kāpēc mirušie objekti norāda viens uz otru?
No 3. viļņa atkritumi apzināti tiek sasaistīti ciklos. Atsauču skaitīšana tos nekad nevar atbrīvot, jo katram paliek ienākoša atsauce; izsekojošs savācējs tos vienkārši nekad nesasniedz.
Kāpēc klikšķis uz dzīva objekta ir liktenīgs?
Jo atbrīvot atmiņu, uz kuru vēl norāda, ir use-after-free — liela daļa īstu avāriju un ievainojamību. Spēle pret to ir tikpat nesaudzīga kā tavs atmiņas piešķīrējs.