Middle+
Ինչպես է աշխատում աղբամատը Go ծրագրավորման լեզվում?
sobes.tech AI
Պատասխան AI-ից
Գարեջրի հավաքիչը Go-ում հիմնված է նշման-հեռացման ալգորիթմի վրա՝ հիշողության հատկացումային հրահանգով: Նա աշխատում է հիմնական ծրագրի հետ զուգահեռ և նվազեցնում է ընդհատումները:
Հիմնական կետեր:
- ** Երեք գույների հավաքածու:**
- Ա սպիտակ: Օբյեկտներ, որոնք չեն եղել այցելված և հնարավոր է՝ աղբ են:
- Մոխրագույն: Օբյեկտներ, որոնք հասանելի են արմատներից, բայց դեռ չեն սկանավորվել:
- Սև: Օբյեկտներ, որոնք հասանելի են արմատներից և արդեն սկանավորվել են:
- Նշում: Հավաքիչը սկսում է արմատներից (գլոբալ փոփոխականներ, յուրաքանչյուր գորուտինի ստեկ), նշելով հասանելի օբյեկտները որպես մոխրագույն: Այնուհետև նա ռեկուրսիվ սկանավորում է մոխրագույն օբյեկտները, նշում նրանցից հասանելի օբյեկտները որպես մոխրագույն, իսկ սկանավորվող օբյեկտները դառնում են սև:
- STW փուլ (Ավարտել-Ամենուր) նշման ժամանակ: Կարճ ժամանակով կանգնեցնում է բոլոր գորուտինները նշման սկզբին՝ օբյեկտների գրաֆի պատկերը ստանալու և վերջում՝ վիճակի փոխելու համար:
- Համաժամանակյա նշում: Նշման հիմնական մասը կատարվում է ծրագրի աշխատանքին զուգահեռ:
- Ջնջում: Նշման ավարտից հետո բոլոր սպիտակ մնացած օբյեկտները համարվում են հասանելի չլինող և ազատվում:
// Օրինակ՝ երբ օբյեկտը դառնում է հասանելի չլինող
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Օբյեկտ ստեղծված, հասանելի
_ = d1 // Օբյեկտի օգտագործում
d1 = nil // Օբյեկտը այլևս հասանելի չէ d1 փոփոխականից:
// Գործարկիչը կարող է ազատել այն հաջորդ ցիկլում:
// Այլ օբյեկտներ, որոնց վրա ոչ ոք չի հղում, նույնպես կարող են հավաքվել:
}
- Տրիգեր: Հավաքիչը սկսվում է, երբ հատկացված հիշողության ծավալը գերազանցում է որոշակի շեմը, որը կախված է նախորդ հատկացված հիշողությունից:
- Նպատակը: Պահպանել ցածր լատենտությունը՝ խուսափելով երկարատև "Ավարտել-Ամենուր" ընդհատումներից:
// Հավաքիչի վարքագիծը կառավարելու համար օգտագործվում են շրջակա միջավայրի փոփոխականներ
// Օրինակ՝ GOGC=off սահմանելով՝ գաբիջժն հավաքումը դադարեցվում է:
Ընդհանուր առմամբ, Go-ի գաբիջժն հավաքիչը արդյունավետ է և պահանջում է նվազագույն մասնակցություն ծրագրավորողի կողմից։