Middle+
Чӣ тавр кор мекунад ҷамъоварии партовҳо дар забони барномасозии Go?
sobes.tech AI
Ҷавоб аз AI
Гаражны зборшчык у Go заснаваны на маркіруюча-выдаляльным алгарытме з трыгерам па выдзяленні памяці. Ён працуе паралельна з асноўнай праграмай і мінімізуе паязы.
Асноўныя моманты:
- Тры наборы колераў:
- Белы: Аб'екты, якія не былі наведаныя і магчыма з'яўляюцца сметай.
- Шэры: Аб'екты, даступныя з каранёў, але яшчэ не прасканаваныя.
- Чорны: Аб'екты, даступныя з каранёў і ўжо прасканаваныя.
- Маркіроўка: Зборшчык пачынаецца з каранёў (глабальных зменных, стеку кожнай горутыны), адзначаючы даступныя аб'екты як шэрыя. Затым ён рэкурсіўна скануе шэрыя аб'екты, адзначае дасягальныя з іх як шэрыя, а скануемыя аб'екты становяцца чорнымі.
- Фаза STW (Stop-The-World) падчас маркіроўкі: Кароткая спыненне выканання ўсіх горутин у пачатку маркіроўкі для стварэння здымка графа аб'ектаў і ў канцы для пераключэння стану.
- Паралельная маркіроўка: Асноўная частка маркіроўкі выконваецца паралельна з працай праграмы.
- Выдаленне: Пасля маркіроўкі ўсе аб'екты, якія засталіся белымі, лічацца недаступнымі і вызваляюцца. Go не патрабуе відавочнага абнулення ўказальнікаў.
// Прыклад: калі аб'ект становіцца недаступным
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Аб'ект створаны, даступны
_ = d1 // Выкарыстанне аб'екта
d1 = nil // Аб'ект больш недаступны з пераменнай d1.
// Зборшчык смецця можа яго вызваліць пры наступным цыкле.
// Іншыя аб'екты, на якія ніхто не спасылаецца, таксама могуць быць сабраны.
}
- Трыгер: Зборшчык запускаецца, калі аб'ём выдзеленага памяці перавышае пэўны парог, залежны ад папярэдняга аб'ёму выдзеленага памяці. Па змаўчанні гэты парог у два разы больш за папярэдні выкарыстаны аб'ём памяці.
- Мэта: Падтрымліваць нізкую затрымку, пазбягаючы працяглых паязоў "Stop-The-World".
// Можна кіраваць паводзінамі зборшчыка з дапамогай зменных асяроддзя
// 예를 들어, GOGC=off를 설정하면 가비지 수집이 비활성화됩니다.
У цэлым, зборшчык смецця Go эфектыўны і патрабуе мінімальнага ўдзелу распрацоўніка.