GC — zostań odśmiecaczem
Usuń wszystkie obiekty, do których korzenie już nie sięgają, zanim sterta się zapełni. Zwolnienie żywego to segfault. Gra o osiągalności.
Jesteś odśmiecaczem. Usuń wszystko, do czego korzenie już nie sięgają.
Jak grać
- Pomarańczowe obiekty to korzenie — zmienne lokalne i globalne. Zawsze żyją.
- Obiekt żyje, jeśli można do niego dojść po referencjach od któregoś korzenia. Cała reszta to śmieci.
- Klikaj śmieci, zanim skończy się czas. Kliknięcie czegoś wciąż osiągalnego zwalnia żywą pamięć — segfault, koniec gry.
Jak to działa
Na stercie pojawiają się obiekty z referencjami między nimi. Pomarańczowe to korzenie — zmienne lokalne i globalne — a wszystko, do czego dojdziesz po referencjach od korzenia, żyje. Reszta to śmieci, które musisz usunąć, zanim skończy się czas. Kliknięcie żywego obiektu oznacza zwolnienie pamięci, na którą coś jeszcze wskazuje: segfault. Od fali 3 martwe obiekty wskazują na siebie w cyklach — dokładnie ten przypadek, którego zliczanie referencji nie potrafi zwolnić.
Gra o regule osiągalności leżącej u podstaw śledzących odśmiecaczy. Prawdziwe odśmiecacze zajmują się też generacjami, barierami zapisu i współbieżnością.
Najczęstsze pytania
Jak gra ustala, co jest śmieciem?
Przez osiągalność liczoną na żywo: podąża za referencjami od każdego korzenia i oznacza to, co znajdzie. Nieoznaczone to śmieci. To dokładnie faza znakowania mark-and-sweep.
Dlaczego martwe obiekty wskazują na siebie?
Od fali 3 śmieci są celowo łączone w cykle. Zliczanie referencji nigdy ich nie zwolni, bo każdy obiekt zachowuje referencję przychodzącą; odśmiecacz śledzący po prostu nigdy do nich nie dociera.
Dlaczego kliknięcie żywego obiektu jest zabójcze?
Bo zwolnienie pamięci, na którą coś jeszcze wskazuje, to use-after-free — źródło dużej części prawdziwych awarii i exploitów. Gra jest pod tym względem tak samo bezlitosna jak alokator.