Jakiego rodzaju śmieci używa Go?

Go to język zbierany przez śmieci:

Http://golang.org/doc/go_faq.html#garbage_collection

Tutaj jest napisane, że jest to mark-and-sweep garbage collector, ale nie zagłębia się w szczegóły, a wymiana jest w toku... wydaje się jednak, że ten akapit nie był zbytnio aktualizowany od czasu wydania Go.

To wciąż mark-and-sweep? Jest konserwatywny czy precyzyjny? Czy to pokoleniowe?

Author: Michael J. Barber, 2011-10-19

5 answers

Plany Go 1.4+ garbage collector:

  • hybrid stop-the-world / kolektor współbieżny
  • stop-the-world part limited by a 10ms deadline
  • rdzenie procesora dedykowane do uruchamiania współbieżnego kolektora
  • trójkolorowy algorytm mark-and-sweep
  • nie-pokoleniowe
  • bez zagęszczania
  • w pełni precyzyjny
  • ponoszą niewielkie koszty, jeśli program porusza się po]}
  • mniejsze opóźnienie, ale najprawdopodobniej również mniejsza przepustowość, niż Go 1.3 GC

Go 1.3 aktualizacje garbage collector na górze Go 1.1:

  • współbieżne zamiatanie (powoduje mniejsze czasy pauzy)
  • w pełni precyzyjny

Go 1.1 garbage collector:

  • mark-and-sweep (implementacja równoległa)
  • nie-pokoleniowe
  • bez zagęszczania
  • głównie precyzyjne (z wyjątkiem ramek stosu)
  • stop-the-world
  • reprezentacja oparta na bitmapie
  • zero-koszt gdy program nie alokuje pamięci (czyli: tasowanie wskaźników jest tak szybkie jak w C, chociaż w praktyce działa to nieco wolniej niż w C, ponieważ kompilator Go nie jest tak zaawansowany jak kompilatory C, takie jak GCC)
  • obsługuje finalizery na obiektach
  • nie ma wsparcia dla słabych referencji

Go 1.0 garbage collector:

  • tak samo jak Go 1.1, ale zamiast być w większości precyzyjnym, garbage collector jest konserwatywny. Konserwatywny GC jest w stanie ignorować obiekty takie jak [] bajt.

Zastąpienie GC innym jest kontrowersyjne, na przykład:

  • z wyjątkiem bardzo dużych hałd, nie jest jasne, czy generacyjne GC byłoby szybsze ogólnie
  • Pakiet "unsafe" sprawia, że trudno jest wdrożyć w pełni precyzyjne GC i zagęszczanie GC
 100
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-24 17:48:53

(dla Go 1.8 - Q1 2017, patrz poniżej )

The next Go 1.5 concurrent Garbage Collector
Oto propozycja przedstawiona w niniejszym dokumencie , która może sprawić, że Go 1.5, ale także pomoże zrozumieć gc w Go.

Możesz zobaczyć stan przed 1.5 (Stop the World: STW)

[[2]}Przed Go 1.5, Go użył kolektora parallel stop-the-world (STW).
Podczas gdy kolekcja STW ma wiele wad, ma przynajmniej przewidywalne i kontrolowane zachowanie wzrostu sterty.

https://40.media.tumblr.com/49e6556b94d75de1050c62539680fcf9/tumblr_inline_nr6qq8D9FE1sdck2n_540.jpg

(zdjęcie z prezentacji GopherCon 2015 "Go GC: rozwiązywanie problemu opóźnień w Go 1.5")

[[2]}jedynym pokrętłem strojenia dla kolektora STW był "GOGC", względny wzrost kupy między kolekcjami. Domyślne ustawienie, 100%, powodowało zbieranie śmieci za każdym razem, gdy rozmiar stosu podwoił się w stosunku do rzeczywistego rozmiaru stosu poprzednia Kolekcja:

https://docs.google.com/drawings/image?id=sLJ_JvGfPfPnojLlEGLCWkw&rev=1&h=113&w=424&ac=1

GC timing w kolektorze STW.

Go 1.5 wprowadza współbieżny kolektor.
Ma to wiele zalet w stosunku do kolekcji STW, ale jest trudniejsze do kontrolowania, ponieważ aplikacja może przydzielać pamięć podczas działania garbage collector.

https://40.media.tumblr.com/783c6e557b427a5c023520578740eb94/tumblr_inline_nr6qqpmaJx1sdck2n_540.jpg

(zdjęcie z prezentacji GopherCon 2015 "Go GC: rozwiązywanie opóźnień Problem w Go 1.5")

Aby osiągnąć ten sam limit wzrostu sterty, runtime musi rozpocząć garbage collection wcześniej, ale ile wcześniej zależy od wielu zmiennych, z których wielu nie da się przewidzieć.

  • Uruchom kolektor zbyt wcześnie, a aplikacja wykona zbyt wiele zbiórek śmieci, marnując zasoby procesora.
  • Uruchom kolektor zbyt późno, a aplikacja przekroczy pożądany maksymalny wzrost sterty.

Osiągnięcie właściwej równowagi bez poświęcania współbieżności wymaga starannego poruszania się garbage collector.

GC pacing ma na celu optymalizację dwóch wymiarów: wzrostu sterty i procesora wykorzystywanego przez garbage collector.

https://docs.google.com/drawings/image?id=sEZYCf7Mc0E0EGmy4gho3_w&rev=1&h=235&w=457&ac=1

Konstrukcja GC pacingu składa się z czterech elementów:

    W 2007 roku firma została założona w 2008 roku.]}
  1. mechanizm dla mutatorów do wykonywania szacowanych ilość pracy skanowania do czasu alokacji sterty osiągnie cel sterty,
  2. [72]}scheduler do skanowania w tle, gdy mutator pomaga w niedostatecznym wykorzystaniu budżetu procesora i
  3. kontroler proporcjonalny do wyzwalacza GC.

Projekt równoważy dwa różne widoki czasu: Czas procesora i czas sterty .

  • Czas procesora jest jak standardowy zegar ścienny, ale mija GOMAXPROCS razy szybciej.
    Czyli jeśli GOMAXPROCS jest 8, to osiem sekund procesora mija każdą sekundę na ścianie, a GC dostaje dwie sekundy czasu procesora na każdą sekundę na ścianie.
    CPU scheduler zarządza czasem procesora.
  • przebieg 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 szybkości alokacji i może się stale zmieniać.
Mutator pomaga zarządzać upływem czasu sterty, zapewniając szacunkowe prace skanowania zostały zakończone przez czas, gdy sterta osiągnie rozmiar celu.
Wreszcie, kontroler wyzwalacza tworzy pętlę sprzężenia zwrotnego, która łączy te dwa widoki czasu, optymalizując zarówno czas sterty, jak i czas procesora.

 25
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:42

Oto implementacja GC:

Https://github.com/golang/go/blob/master/src/runtime/mgc.go

Z dokumentów w źródle:

GC działa jednocześnie z wątkami mutatora, jest typu dokładnego (aka precyzyjnego), pozwala na równoległe działanie wielu wątków GC. Jest to współbieżny znak i zamiatanie, które wykorzystuje barierę zapisu. Jest ona niepolegająca i niepogniskowa. Alokacja odbywa się przy użyciu segregowanych wielkości na obszary alokacji P, aby zminimalizować fragmentacja przy jednoczesnym wyeliminowaniu zamków w powszechnym przypadku.

 14
Author: berdario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-25 16:59:56

Go 1.8 GC może ewoluować ponownie, z propozycją "wyeliminuj ponowne skanowanie stosu STW"

Od wersji Go 1.7, jedynym pozostałym źródłem nieograniczonego i potencjalnie nietrywialnego stop-the-world (STW) jest ponowne skanowanie stosu.

Proponujemy wyeliminowanie potrzeby ponownego skanowania stosu przez przełączenie na hybrydową barierę zapisu, która łączy w sobie barierę zapisu delecji w stylu Yuasa [Yuasa '90] i barierę zapisu wstawiania w stylu Dijkstry [Dijkstra ' 78] .

Wstępne eksperymenty pokazują, że może to skrócić najgorszy czas STW do poniżej 50µs, a takie podejście może sprawić, że praktyczne będzie całkowite wyeliminowanie zakończenia znaku STW.

Ogłoszenie jest tutaj i możesz zobaczyć odpowiedni commit źródłowy to d70b0fe i wcześniej.

 6
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-29 08:42:11

Nie jestem pewien, ale myślę, że obecny (tip) GC jest już równoległy, a przynajmniej jest WIP. Tak więc nieruchomość stop-the-world nie ma już zastosowania lub nie będzie w najbliższej przyszłości. Być może ktoś inny może wyjaśnić to bardziej szczegółowo.

 2
Author: jnml,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-20 05:42:02