(Про Go 1,8 - 1 квартал 2017 року див. Нижче )
Наступний Go-1.5 одночасний збирач сміття передбачає можливість "темпу", сказаного в gc.
Ось пропозиція, представлена в цьому документі, яка може зробити його для Go 1.5, але також допоможе зрозуміти Gc в Go.
Ви можете бачити стан до 1,5 (Stop The World: STW)
До Go 1.5 Go використовував паралельний колектор зупинки світу (STW).
Незважаючи на те, що у колекції STW є багато недоліків, вона, принаймні, має передбачувану та керовану поведінку нагромадження.
(Фото з презентації GopherCon 2015 « Іди GC: вирішення проблеми із затримкою у програмі Go 1.5 »)
Єдиною ручкою настройки колектора STW був “GOGC”, відносний приріст купи між колекціями. Налаштування за замовчуванням, 100%, спрацьовує збирання сміття кожного разу, коли розмір купи вдвічі перевищує розмір живої купи порівняно з попередньою колекцією:
Час GC в колекторі STW.
Go 1.5 представляє одночасно колектор .
Це має багато переваг у порівнянні зі збором STW, але це надзвичайно важко контролювати зростання купи, оскільки програма може виділяти пам'ять під час роботи сміттєзбірника .
(Фото з презентації GopherCon 2015 « Іди GC: вирішення проблеми із затримкою у програмі Go 1.5 »)
Щоб досягти такого ж обмеження зростання купи, час виконання повинен почати збирання сміття раніше, але скільки раніше залежить від багатьох змінних, багатьох з яких неможливо передбачити.
- Запускайте колектор занадто рано, і додаток виконає занадто багато сміття, витрачаючи ресурси процесора.
- Запускайте колектор занадто пізно, і додаток перевищить бажаний максимальний ріст купи.
Досягнення правильного балансу без шкоди для одночасності вимагає обережного кроку до сміттєзбірника.
GC-пейсинг має на меті оптимізувати два аспекти: зростання купи та процесор, що використовується сміттєзбірником.
Конструкція темпу GC складається з чотирьох компонентів:
- Оцінювач обсягу скануючої роботи, необхідної для циклу GC,
- механізм для мутаторів виконувати передбачуваний обсяг скануючої роботи до часу розподілу купи досягає мети,
- планувальник фонового сканування, коли мутатор допомагає недостатньо використовувати бюджет процесора, і
- пропорційний контролер для тригера GC.
Дизайн врівноважує два різні погляди на час: час процесора та час збирання .
- Час процесора - це як звичайний настінний годинник, але проходить в
GOMAXPROCS
рази швидше.
Тобто, якщо GOMAXPROCS
це 8, то вісім CPU секунд проходять кожну стіну секунди, і GC отримує дві секунди часу процесора кожну стіну секунди.
Планувальник процесора керує часом процесора.
- Проходження часу купи вимірюється в байтах і рухається вперед по мірі виділення мутаторів.
Взаємозв'язок між часом нагромадження і часом стіни залежить від швидкості розподілу і може постійно змінюватися.
Мутатор допомагає керувати плином часу купи, забезпечуючи завершення передбачуваної роботи сканування до моменту досягнення купи цільового розміру.
Нарешті, контролер тригера створює цикл зворотного зв’язку, який пов'язує ці два погляди часу разом, оптимізуючи як час, так і цілі процесора.