Sobes.tech
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-ի գաբիջժն հավաքիչը արդյունավետ է և պահանջում է նվազագույն մասնակցություն ծրագրավորողի կողմից։