Sobes.tech
Middle

Ի՞նչ գիտեք Go լեզվի աղբամանի մասին։

sobes.tech AI

Պատասխան AI-ից

Golang օգտագործում է պառլելային և ցածր լատենտության հավաքիչ աղբյուրների վրա հիմնված mark-sweep ալգորիթմով:

Հիմնական հատկանիշները՝

  1. ** Երեք-գույն ալգորիթմ (Three-color algorithm):** Նշում է օբյեկտները երեք գույներով՝ սպիտակ (պոտենցիալ աղբյուր), գորշ (օբյեկտը հասանելի է, բայց նրա ժառանգները չեն ստուգվել) և սև (օբյեկտը և նրա ժառանգները հասանելի են):
  2. Պառլելային (Parallel): աշխատում է օգտվողի գորուտինների հետ միաժամանակ մի քանի միջուկով, նվազեցնելով կանգառի ժամանակը:
  3. Կոնկուրսիվ (Concurrent): մեծ մասը GC-ի աշխատանքը կատարվում է ծրագրի կատարման ժամանակ:
  4. Նվազեցում կանգառի ժամանակը (Low-latency Stop-The-World): բոլոր գորուտինների կանգառի ժամանակը շատ կարճ է, օգտագործվում է միայն «նշման սկզբի» (start of marking) և «նշման ավարտի» (end of marking) փուլերում՝ օբյեկտների գրաֆի համահունչությունը ապահովելու համար:
  5. Վերօգտագործվող սկանավորումներ (Stack scanning): սկանավորումը նաև կատարվում է միաժամանակ և մրցակցային կերպով STW-ի հետ:
  6. Համայնքի մակարդակի նպատակային լրացման (Heap growth target): GC-ն ձգտում է պահել որոշակի տոկոսադրույք լրացվածության հետո՝ խուսափելու շատ հաճախ կամ շատ հազվադեպ ցիկլերից: Այս շեմը կարելի է վերահսկել GOGC փոփոխականի միջոցով: Դեպքային արժեքը GOGC=100, ինչը նշանակում է, որ GC-ը սկսվում է, երբ հիպի չափը կրկնապատկվում է:

GC-ի աշխատանքային ցիկլը բաղկացած է հետևյալ փուլերից:

  1. GCstart: Կարճ STW փուլ: որոշվում են ռուչ օբյեկտները նշման համար:
  2. GCmark: Կոնկուրսիվ փուլ: GC-ն անցնում է օբյեկտների գրաֆը և նշում հասանելի օբյեկտները (սև գույն -> սև գույն): Օգտագործում է write barrier՝ փոփոխությունները հետևելու համար նշման ժամանակ:
  3. GCmarktermination: Կարճ STW փուլ: Завершает նշումը և անցնում է sweep-ին:
  4. GCsweep: Կոնկուրսիվ փուլ: Անհասանելի (սպիտակ) օբյեկտները ազատվում են:

GC-ը ավտոմատ կերպով կառավարվում է և մեծամասամբ չի պահանջում ձեռքով կանչել: GC-ի կատարողականությունը կարելի է հետևել GODEBUG=gctrace=1 միջավայրային փոփոխականների միջոցով:

Օրինակ՝

$ GODEBUG=gctrace=1 go run your_program.go

gctrace արտածումը ցույց է տալիս յուրաքանչյուր GC ցիկլի մասին տեղեկություններ՝ փուլերի ժամանակներ, հիպի չափը և STW-ի ժամանակը:

GC-ի օպտիմալացման համար, բացի GOGC կարգավորումից, կարելի է դիտարկել՝

  • Հաճախակի ալոկացիաների նվազեցում (օրինակ՝ բուֆերների կրկնակի օգտագործում, անպետք փոխակերպումների խուսափում):
  • escape analysis-ի պրոֆիլավորում՝ հասկանալու համար, թե որ օբյեկտները ալոկացվում են հիպում:
  • sync.Pool-ի օգտագործում՝ հաճախ ստեղծվող և ազատվող օբյեկտների համար: