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

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

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

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

Он по-прежнему помечает-и-sweep? Является ли он консервативным или точным? Это поколение?

Ответ 1

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

  • гибридный стоп-мир/параллельный сборщик
  • конец-мир, ограниченный крайним сроком 10 мс
  • Процессорные ядра, предназначенные для запуска параллельного коллектора
  • трехцветный алгоритм маркировки и развертки
  • не поколения
  • не уплотняя
  • полностью точный
  • берет небольшую стоимость, если программа перемещает указатели вокруг
  • более низкая задержка, но, скорее всего, также более низкая пропускная способность, чем 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 способен игнорировать объекты, такие как [] байт.

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

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

Ответ 2

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

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

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

До перехода 1.5 Go использовал коллекцию parallel stop-the-world (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 вводится параллельный сборщик.
У этого есть много преимуществ по сравнению с коллекцией STW, но это тяжелый контроль кучи akes, потому что приложение может выделять память, пока сборщик мусора работает.

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

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

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

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

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

Ориентация на GC направлена ​​на оптимизацию по двум измерениям: росту кучи и процессору, используемому сборщиком мусора.

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Мы предлагаем устранить необходимость повторного сканирования стека, переключившись на гибридный барьер записи, который сочетает в себе барьер удаления записи в стиле Yuasa [Yuasa '90] и барьер ввода в стиле Дейкстра [Dijkstra '78].

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

Объявление d70b0fe и ранее.

Ответ 5

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