Какую сборку мусора использует Go?
Go-это язык сбора мусора:
http://golang.org/doc/go_faq.html#garbage_collection
здесь говорится, что это сборщик мусора mark-and-sweep, но он не вникает в детали, и замена находится в работе... тем не менее, этот пункт, похоже, не был сильно обновлен с момента выхода Go.
Это все еще Марк-и-развертки? Это консервативно или точно? Это поколенческое?
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 имеет много недостатков, она, по крайней мере, имеет предсказуемое и контролируемое поведение роста кучи.
(фото GopherCon 2015 презентация "Go GC: решение проблемы задержки в Go 1.5")
единственным регулятором настройки для коллектора STW был "GOGC", относительный рост кучи между коллекциями. Значение по умолчанию, 100%, запускало сборку мусора каждый раз, когда размер кучи удваивался по сравнению с размером живой кучи в предыдущей коллекции:
время GC в сборнике STW.
Go 1.5 вводит a параллельный сборщик.
Это имеет много преимуществ перед коллекцией STW, но это mрост кучи akes труднее контролировать, потому что приложение может выделять память во время мусора коллектор работает.
(фото GopherCon 2015 презентация "Go GC: решение проблемы задержки в Go 1.5")
для достижения того же предела роста кучи среда выполнения должна начать сборку мусора раньше, но насколько раньше, зависит от многих переменных, многие из которых не могут быть предсказаны.
- начать сборщик слишком рано,и приложение будет выполнять слишком много сборщиков мусора, тратя ресурсы процессора.
- запустите коллектор слишком поздно, и приложение превысит желаемый максимальный рост кучи.
достижение правильного баланса без ущерба для параллелизма требует тщательной настройки сборщика мусора.
GC pacing нацелен на оптимизацию по двум измерениям: рост кучи и процессор, используемый мусором коллекционер.
конструкция GC pacing состоит из четырех компонентов:
- оценка объема работы сканирования цикла GC потребует,
- механизм для мутаторов для выполнения расчетного объема работы сканирования к моменту выделения кучи достигает цели кучи,
- планировщик для фонового сканирования, когда мутатор помогает недоиспользовать бюджет процессора, и
- пропорциональный контроллер для триггера GC.
дизайн остатков два разных вида времени: время процессора и время кучи.
- процессорного времени как стандартное время настенных часов, но проходит
GOMAXPROCSраза быстрее.
То есть, еслиGOMAXPROCS8, затем восемь секунд процессора проходят каждую секунду стены, и 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