Middle
Оё шумо дар бораи ҷамъкунандаи партовҳо дар забони Go чӣ медонед?
sobes.tech AI
Ҷавоб аз AI
Golang истифодаи параллелӣ ва ҷамъкунандаи партовҳои паст-зеркашӣ бо алгоритми марк-свипро истифода мебарад.
Хусусиятҳои асосӣ:
- Алгоритми се-ранг (Three-color algorithm): Объектҳоро бо се ранг нишон медиҳад: сафед (потенсиалии партов), хокистарӣ (объект дастрас аст, аммо фарзандони он санҷиш нашудаанд) ва сиёҳ (объект ва фарзандони он дастрасанд).
- Параллелӣ (Parallel): Бо gorutinҳои истифодабаранда дар чанд ядро кор мекунад, вақти боздоштаро кам мекунад.
- Конкурентӣ (Concurrent): Бисёре аз корҳо дар GC ҳамзамон бо иҷрои барнома анҷом меёбанд.
- Кам кардани вақти боздоштан (Low-latency Stop-The-World): Вақти боздошти ҳамаи gorutinҳо (STW) хеле кӯтоҳ аст, танҳо барои фазаҳои "шурӯъ аз марк кардан" (start of marking) ва "тамом кардани марк кардан" (end of marking) истифода мешавад, то графи объектҳо мутобиқ бошад.
- Таҳқиқи дубора истифодашаванда (Stack scanning): Скани стекҳо низ параллелӣ ва ҳамзамон бо STW анҷом дода мешавад.
- Ҳадафи сатҳи пуршавии хип (Heap growth target): GC кӯшиш мекунад, ки пас аз ҳар як давр сатҳи муайянро нигоҳ дорад, то аз даврҳои хеле зуд ё суст пешгирӣ кунад. Ин ҳадфро бо тағйирёбандаи
GOGCназорат кардан мумкин аст. Ба таври пешфарзGOGC=100, ки маънои онро дорад, ки GC вақте оғоз мешавад, ки андозаи хип ду баробар мешавад.
Фазои кори GC аз қадамҳои зерин иборат аст:
- GCstart: Фазаи кӯтоҳи STW. Объектҳои реша барои марк кардан муайян карда мешаванд.
- GCmark: Фазаи ҳамзамон. GC графи объектҳоро мегузарад ва объектҳои дастрасро нишон медиҳад (ранги хокистарӣ -> сиёҳ). Баръакси write barrier барои пайгирии тағйирот дар граф дар вақти марк кардан истифода мешавад.
- GCmarktermination: Фазаи кӯтоҳи STW. Маркро тамом мекунад ва аз write barrier ба sweep мегузарад.
- GCsweep: Фазаи ҳамзамон. Объектҳои дастрас набуда (сафед) озод карда мешаванд. Ин фазо метавонад дар пасзамина ё дар вақти зарурат барои алокацияи ёдгирии нав анҷом дода шавад.
GC дар Go автоматӣ идора мешавад ва дар аксар ҳолатҳо ба даъвати дастӣ ниёз надорад. Иҷрои GC-ро бо истифода аз тағйирёбандаҳои муҳити зисти GODEBUG=gctrace=1 назорат кардан мумкин аст.
Масалан барои назорат:
$ GODEBUG=gctrace=1 go run your_program.go
Натиҷаи gctrace маълумот медиҳад дар бораи ҳар як даври GC, аз ҷумла вақти фазоҳо, андозаи хип ва вақти STW.
Барои оптимизатсия, ғайр аз танзимоти GOGC, метавон ба назар гирифт:
- Кам кардани алокаҳо (масалан, бо истифодаи дубора аз буферҳо, парҳез аз табдилоти нолозим).
- Профилирование бо "escape analysis" барои фаҳмидани кадом объектҳо дар хип алока карда мешаванд.
- Истифодаи пулҳо (
sync.Pool) барои объектҳои зуд-зуд сохта ва озодшуда.