(Dla Go 1.8 - Q1 2017, patrz poniżej )
Następny współbieżny Garbage Collector Go 1.5 obejmuje możliwość „tempa” wspomnianego gc.
Oto propozycja przedstawiona w tym artykule, która może sprawić, że będzie działać w Go 1.5, ale także pomoże zrozumieć gc w Go.
Możesz zobaczyć stan sprzed 1.5 (Stop The World: STW)
Przed Go 1.5, Go używał równoległego kolektora Stop-the-World (STW).
Chociaż zbieranie STW ma wiele wad, ma przynajmniej przewidywalne i kontrolowane zachowanie wzrostu sterty.
(Zdjęcie z prezentacji GopherCon 2015 „ Go GC: Solving the Latency Problem in Go 1.5 ”)
Jedynym pokrętłem strojenia dla kolekcjonera STW było „GOGC”, względny wzrost sterty między kolekcjami. Domyślne ustawienie, 100%, wyzwalało wyrzucanie elementów bezużytecznych za każdym razem, gdy rozmiar sterty podwoił się w stosunku do aktualnego rozmiaru sterty od poprzedniej kolekcji:
GC taktowanie w kolektorze STW.
Wersja 1.5 wprowadza współbieżny kolektor .
Ma to wiele zalet w porównaniu z kolekcjonowaniem STW, ale utrudnia kontrolowanie wzrostu sterty, ponieważ aplikacja może przydzielać pamięć podczas działania modułu odśmiecania pamięci .
(Zdjęcie z prezentacji GopherCon 2015 „ Go GC: Solving the Latency Problem in Go 1.5 ”)
Aby osiągnąć ten sam limit wzrostu sterty, środowisko wykonawcze musi rozpocząć czyszczenie pamięci wcześniej, ale to, ile wcześniej jest zależne od wielu zmiennych, z których wielu nie można przewidzieć.
- Uruchom moduł zbierający zbyt wcześnie, a aplikacja wykona zbyt wiele operacji czyszczenia pamięci, marnując zasoby procesora.
- Uruchom kolektor zbyt późno, a aplikacja przekroczy żądany maksymalny wzrost sterty.
Osiągnięcie właściwej równowagi bez poświęcania współbieżności wymaga ostrożnego przechodzenia przez moduł odśmiecania pamięci.
Tempo GC ma na celu optymalizację w dwóch wymiarach: wzrost sterty i procesor używany przez moduł odśmiecania pamięci.
Projekt stymulacji GC składa się z czterech elementów:
- estymator ilości pracy skanowania wymaganej przez cykl GC,
- mechanizm umożliwiający mutatorom wykonanie szacowanej ilości pracy skanowania do czasu, gdy alokacja sterty osiągnie cel sterty,
- harmonogram skanowania w tle, gdy mutator pomaga w niepełnym wykorzystaniu budżetu procesora, oraz
- proporcjonalny kontroler wyzwalacza GC.
Projekt równoważy dwa różne widoki czasu: czas procesora i czas sterty .
- Czas procesora jest podobny do standardowego czasu zegara ściennego, ale płynie
GOMAXPROCS
szybciej.
Oznacza to, że jeśli GOMAXPROCS
wynosi 8, to osiem sekund procesora przechodzi na każdą sekundę ściany, a GC otrzymuje dwie sekundy czasu procesora na sekundę ściany.
Program planujący procesora zarządza czasem procesora.
- Upływ czasu sterty jest mierzony w bajtach i przesuwa się do przodu w miarę alokacji mutatorów.
Zależność między czasem sterty a czasem ściany zależy od wskaźnika alokacji i może się stale zmieniać.
Mutator pomaga zarządzać upływem czasu sterty, zapewniając, że szacowana praca skanowania została ukończona do czasu, gdy sterta osiągnie docelowy rozmiar.
Wreszcie, kontroler wyzwalacza tworzy pętlę sprzężenia zwrotnego, która łączy te dwa widoki czasu razem, optymalizując zarówno pod kątem czasu sterty, jak i czasu procesora.