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.

Powiązane narzędzia

Osadź tę grę

Dodaj tę darmową grę do swojej strony: