Middle
Ի՞նչ գիտեք Go լեզվի աղբամանի մասին։
sobes.tech AI
Պատասխան AI-ից
Golang օգտագործում է պառլելային և ցածր լատենտության հավաքիչ աղբյուրների վրա հիմնված mark-sweep ալգորիթմով:
Հիմնական հատկանիշները՝
- ** Երեք-գույն ալգորիթմ (Three-color algorithm):** Նշում է օբյեկտները երեք գույներով՝ սպիտակ (պոտենցիալ աղբյուր), գորշ (օբյեկտը հասանելի է, բայց նրա ժառանգները չեն ստուգվել) և սև (օբյեկտը և նրա ժառանգները հասանելի են):
- Պառլելային (Parallel): աշխատում է օգտվողի գորուտինների հետ միաժամանակ մի քանի միջուկով, նվազեցնելով կանգառի ժամանակը:
- Կոնկուրսիվ (Concurrent): մեծ մասը GC-ի աշխատանքը կատարվում է ծրագրի կատարման ժամանակ:
- Նվազեցում կանգառի ժամանակը (Low-latency Stop-The-World): բոլոր գորուտինների կանգառի ժամանակը շատ կարճ է, օգտագործվում է միայն «նշման սկզբի» (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 փուլ: Завершает նշումը և անցնում է sweep-ին:
- GCsweep: Կոնկուրսիվ փուլ: Անհասանելի (սպիտակ) օբյեկտները ազատվում են:
GC-ը ավտոմատ կերպով կառավարվում է և մեծամասամբ չի պահանջում ձեռքով կանչել: GC-ի կատարողականությունը կարելի է հետևել GODEBUG=gctrace=1 միջավայրային փոփոխականների միջոցով:
Օրինակ՝
$ GODEBUG=gctrace=1 go run your_program.go
gctrace արտածումը ցույց է տալիս յուրաքանչյուր GC ցիկլի մասին տեղեկություններ՝ փուլերի ժամանակներ, հիպի չափը և STW-ի ժամանակը:
GC-ի օպտիմալացման համար, բացի GOGC կարգավորումից, կարելի է դիտարկել՝
- Հաճախակի ալոկացիաների նվազեցում (օրինակ՝ բուֆերների կրկնակի օգտագործում, անպետք փոխակերպումների խուսափում):
escape analysis-ի պրոֆիլավորում՝ հասկանալու համար, թե որ օբյեկտները ալոկացվում են հիպում:sync.Pool-ի օգտագործում՝ հաճախ ստեղծվող և ազատվող օբյեկտների համար: