Sobes.tech
Middle+

როგორ მუშაობს გო პროგრამირების ენაში მტვრის შეგროვება?

sobes.tech AI

პასუხი AI-სგან

გა-ის მტვერსასრუტი დაფუძნებულია მარკირების-წაშლის ალგორითმზე, რომელიც იყენებს მეხსიერების გამოყოფის ტრიგერს. ის მუშაობს ძირითადი პროგრამის პარალელურად და მინიმუმამდე ამცირებს პაუზებს:

ძირითადი მახასიათებლები:

  • სამი ფერის სია:
    • თეთრი: ობიექტები, რომლებიც არ ყოფილა მონახულებული და სავარაუდოდ ნაგავია:
    • მოყავისფრო: ობიექტები, რომლებიც ხელმისაწვდომია ფესვებიდან, მაგრამ ჯერ არ არის სკანირებული:
    • შავი: ობიექტები, რომლებიც ხელმისაწვდომია ფესვებიდან და უკვე სკანირებულია:
  • მარკირება: მტვერსასრუტი იწყება ფესვებიდან (გლობალური ცვლადები, თითოეული გორუტინის სტეკი), მონიშნავს ხელმისაწვდომ ობიექტებს როგორც მოყავისფრო. შემდეგ ის რეკურსიულად სკანირებს მოყავისფრო ობიექტებს, მონიშნავს მათგან მისაღწევებს როგორც მოყავისფრო, ხოლო სკანირებადი ობიექტები ხდება შავი:
  • STW ფაზა (შეჩერება-დამთავრება-დამყარება) მარკირების დროს: მოკლე დროით ყველა გორუტინის შეჩერება მარკირების დასაწყისში ობიექტების გრაფის სურათის მისაღებად და ბოლოს მდგომარეობის შეცვლისთვის:
  • პარალელური მარკირება: მარკირების ძირითადი ნაწილი ხორციელდება პროგრამის მუშაობასთან პარალელურად:
  • წაშლა: მარკირების შემდეგ, ყველა თეთრი დარჩენილი ობიექტი მიიჩნევა მიუწვდომლად და თავისუფლდება:
// მაგალითი: როდესაც ობიექტი ხდება მიუწვდომელი
type Data struct {
    value int
}

func main() {
    d1 := &Data{value: 10} // ობიექტი შექმნილია, ხელმისაწვდომია
    _ = d1                 // ობიექტის გამოყენება

    d1 = nil // ობიექტი აღარ არის ხელმისაწვდომი d1-ისგან:
            // მტვერსასრუტი მას შეუძლია გაათავისუფლოს შემდეგ ციკლში:

    // სხვა ობიექტებიც, რომელთაც არავინ მიუთითებს, შეიძლება გაწმინდოს:
}
  • ტრიგერი: მტვერსასრუტი იწყება, როდესაც გამოყოფილი მეხსიერების მოცულობა აღემატება გარკვეულ ზღვარს, რომელიც დამოკიდებულია წინამორბედ გამოყოფილ მეხსიერებაზე:
  • მიზანი: შეინარჩუნოს დაბალი ლაგუნა, თავიდან აიცილოს გრძელვადიანი "შეჩერება-დამთავრება" პაუზები:
// მტვერსასრუტის ქცევას შეიძლება მართავდეს გარემოს ცვლადები
// მაგალითად, GOGC=off-ის დაყენებით, გაბიჯი შეგროვება გამორთულია:

საერთო ჯამში, Go-ის მტვერსასრუტი ეფექტურია და მოითხოვს მინიმალურ ჩართულობას დეველოპერის მხრიდან.