Middle+
როგორ მუშაობს გო პროგრამირების ენაში მტვრის შეგროვება?
sobes.tech AI
პასუხი AI-სგან
გა-ის მტვერსასრუტი დაფუძნებულია მარკირების-წაშლის ალგორითმზე, რომელიც იყენებს მეხსიერების გამოყოფის ტრიგერს. ის მუშაობს ძირითადი პროგრამის პარალელურად და მინიმუმამდე ამცირებს პაუზებს:
ძირითადი მახასიათებლები:
- სამი ფერის სია:
- თეთრი: ობიექტები, რომლებიც არ ყოფილა მონახულებული და სავარაუდოდ ნაგავია:
- მოყავისფრო: ობიექტები, რომლებიც ხელმისაწვდომია ფესვებიდან, მაგრამ ჯერ არ არის სკანირებული:
- შავი: ობიექტები, რომლებიც ხელმისაწვდომია ფესვებიდან და უკვე სკანირებულია:
- მარკირება: მტვერსასრუტი იწყება ფესვებიდან (გლობალური ცვლადები, თითოეული გორუტინის სტეკი), მონიშნავს ხელმისაწვდომ ობიექტებს როგორც მოყავისფრო. შემდეგ ის რეკურსიულად სკანირებს მოყავისფრო ობიექტებს, მონიშნავს მათგან მისაღწევებს როგორც მოყავისფრო, ხოლო სკანირებადი ობიექტები ხდება შავი:
- STW ფაზა (შეჩერება-დამთავრება-დამყარება) მარკირების დროს: მოკლე დროით ყველა გორუტინის შეჩერება მარკირების დასაწყისში ობიექტების გრაფის სურათის მისაღებად და ბოლოს მდგომარეობის შეცვლისთვის:
- პარალელური მარკირება: მარკირების ძირითადი ნაწილი ხორციელდება პროგრამის მუშაობასთან პარალელურად:
- წაშლა: მარკირების შემდეგ, ყველა თეთრი დარჩენილი ობიექტი მიიჩნევა მიუწვდომლად და თავისუფლდება:
// მაგალითი: როდესაც ობიექტი ხდება მიუწვდომელი
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // ობიექტი შექმნილია, ხელმისაწვდომია
_ = d1 // ობიექტის გამოყენება
d1 = nil // ობიექტი აღარ არის ხელმისაწვდომი d1-ისგან:
// მტვერსასრუტი მას შეუძლია გაათავისუფლოს შემდეგ ციკლში:
// სხვა ობიექტებიც, რომელთაც არავინ მიუთითებს, შეიძლება გაწმინდოს:
}
- ტრიგერი: მტვერსასრუტი იწყება, როდესაც გამოყოფილი მეხსიერების მოცულობა აღემატება გარკვეულ ზღვარს, რომელიც დამოკიდებულია წინამორბედ გამოყოფილ მეხსიერებაზე:
- მიზანი: შეინარჩუნოს დაბალი ლაგუნა, თავიდან აიცილოს გრძელვადიანი "შეჩერება-დამთავრება" პაუზები:
// მტვერსასრუტის ქცევას შეიძლება მართავდეს გარემოს ცვლადები
// მაგალითად, GOGC=off-ის დაყენებით, გაბიჯი შეგროვება გამორთულია:
საერთო ჯამში, Go-ის მტვერსასრუტი ეფექტურია და მოითხოვს მინიმალურ ჩართულობას დეველოპერის მხრიდან.