Какую сборку мусора использует Go?



Go-это язык сбора мусора:



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



здесь говорится, что это сборщик мусора mark-and-sweep, но он не вникает в детали, и замена находится в работе... тем не менее, этот пункт, похоже, не был сильно обновлен с момента выхода Go.



Это все еще Марк-и-развертки? Это консервативно или точно? Это поколенческое?

1526   5  

5 ответов:

планы на Go 1.4 + сборщик мусора:

  • гибридный стоп-мир / параллельный коллектор
  • stop-the-world part limited by a 10ms deadline
  • ядра процессора, предназначенные для запуска параллельного коллектора
  • трехцветный алгоритм разметки и развертки
  • не-поколений
  • не-сжатие
  • полностью точные
  • несет небольшую стоимость, если программа перемещает указатели вокруг
  • нижняя задержка, но скорее всего и более низкая пропускная способность, чем Go 1.3 GC

Go 1.3 обновления сборщика мусора на вершине Go 1.1:

  • одновременная развертка (приводит к меньшему времени паузы)
  • полностью точные

Go 1.1 сборщик мусора:

  • mark-and-sweep (параллельная реализация)
  • не-поколений
  • не-сжатие
  • главным образом точный (за исключением стога кадры)
  • остановка-в мире
  • растровое представление
  • нулевая стоимость, когда программа не выделяет память (то есть: перетасовка указателей вокруг так же быстро, как в C, хотя на практике это работает несколько медленнее, чем C, потому что компилятор Go не так продвинут, как компиляторы C, такие как GCC)
  • поддерживает финализаторы на объектах
  • нет поддержки слабых ссылок

Go 1.0 мусор коллекционер:

  • то же самое, что и Go 1.1, но вместо того, чтобы быть в основном точным, сборщик мусора консервативен. Консервативный GC может игнорировать такие объекты, как [] byte.

замена GC на другой является спорным, например:

  • за исключением очень больших куч, неясно, будет ли поколение GC быстрее в целом
  • пакет "небезопасный" затрудняет реализацию полностью точного GC и уплотнения ГК

(для перейти 1.8-Q1 2017, см. ниже)

следующий ход 1.5 одновременно сборщик мусора включает в себя возможность "темп" сказал gc.
Вот такое предложение представлено в этой статье что может сделать его для Go 1.5, но также помогает понять gc в Go.

Вы можете увидеть положение до 1.5 (Stop The World: STW)

до 1.5 идти, идти и использовать параллельно стоп-мир (STW) коллектор.
Хотя коллекция STW имеет много недостатков, она, по крайней мере, имеет предсказуемое и контролируемое поведение роста кучи.

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

(фото GopherCon 2015 презентация "Go GC: решение проблемы задержки в Go 1.5")

единственным регулятором настройки для коллектора STW был "GOGC", относительный рост кучи между коллекциями. Значение по умолчанию, 100%, запускало сборку мусора каждый раз, когда размер кучи удваивался по сравнению с размером живой кучи в предыдущей коллекции:

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

время GC в сборнике STW.

Go 1.5 вводит a параллельный сборщик.
Это имеет много преимуществ перед коллекцией STW, но это mрост кучи akes труднее контролировать, потому что приложение может выделять память во время мусора коллектор работает.

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

(фото GopherCon 2015 презентация "Go GC: решение проблемы задержки в Go 1.5")

для достижения того же предела роста кучи среда выполнения должна начать сборку мусора раньше, но насколько раньше, зависит от многих переменных, многие из которых не могут быть предсказаны.

  • начать сборщик слишком рано,и приложение будет выполнять слишком много сборщиков мусора, тратя ресурсы процессора.
  • запустите коллектор слишком поздно, и приложение превысит желаемый максимальный рост кучи.

достижение правильного баланса без ущерба для параллелизма требует тщательной настройки сборщика мусора.

GC pacing нацелен на оптимизацию по двум измерениям: рост кучи и процессор, используемый мусором коллекционер.

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

конструкция GC pacing состоит из четырех компонентов:

  1. оценка объема работы сканирования цикла GC потребует,
  2. механизм для мутаторов для выполнения расчетного объема работы сканирования к моменту выделения кучи достигает цели кучи,
  3. планировщик для фонового сканирования, когда мутатор помогает недоиспользовать бюджет процессора, и
  4. пропорциональный контроллер для триггера GC.

дизайн остатков два разных вида времени: время процессора и время кучи.

  • процессорного времени как стандартное время настенных часов, но проходит GOMAXPROCS раза быстрее.
    То есть, если GOMAXPROCS 8, затем восемь секунд процессора проходят каждую секунду стены, и GC получает две секунды процессорного времени каждую секунду стены.
    Планировщик процессора управляет процессор время.
  • проезд куча времени измеряется в байтах и перемещается вперед по мере выделения мутаторов.

отношение между временем кучи и временем стены зависит от тарифа распределения и может изменить постоянн.
Mutator помогает управлять течением времени кучи, гарантируя, что оценочная работа сканирования была завершена к тому времени, когда куча достигает целевого размера.
Наконец, контроллер триггера создает контур обратной связи, который связывает эти два представления времени вместе, оптимизируя для целей времени кучи и времени процессора.

это реализация GC:

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

из документов в источнике:

GC работает одновременно с потоками мутатора, является точным типом (aka precise), позволяет нескольким потокам GC работать параллельно. Это параллельная метка и развертка, которая использует барьер записи. Он не является поколением и не уплотняется. Распределение выполняется с использованием размера, разделенного на P выделение областей для минимизации фрагментации при одновременном устранении блокировок в общем случае.

Go 1.8 GC может развиваться снова, с предложение "исключить повторное сканирование стека STW"

по состоянию на Go 1.7, единственный оставшийся источник неограниченного и потенциально нетривиального stop-the-world (STW) время повторного сканирования стека.

мы предлагаем устранить необходимость повторного сканирования стека путем переключения на гибридный барьер записи, который сочетает в себе Yuasa-style deletion write barrier [Yuasa ' 90] и a dijkstra-стиль вставки барьера записи [Dijkstra ' 78].

предварительные эксперименты показывают, что это может уменьшить в худшем случае времени СТВ до 50 мкс, и этот подход может сделать его практически исключить прекращение метки STW вполне.

The сообщение здесь и вы можете видеть, что соответствующий источник фиксации является d70b0fe и ранее.

Я не уверен, но я думаю, что текущий (tip) GC уже является параллельным или, по крайней мере, это НЗП. Таким образом, свойство stop-the-world больше не применяется или не будет применяться в ближайшем будущем. Возможно, кто-то другой может прояснить это более подробно.

Comments

    Ничего не найдено.