Middle
რა იცით Go ენის გატეხის შესახებ?
sobes.tech AI
პასუხი AI-სგან
Golang პარალელური და დაბალი ლატენციის მტვრის შეგროვების ალგორითმზე დაფუძნებული mark-sweep-ის გამოყენებას ახდენს.
ძირითადი მახასიათებლები:
- სამფეროვანი ალგორითმი (Three-color algorithm): ობიექტებს სამ ფერად აღნიშნავს: თეთრი (პოტენციური ნაგავი), ნაცრისფერი (ობიექტი ხელმისაწვდომია, მაგრამ მისი შთამომავლები არ არის შემოწმებული) და შავი (ობიექტი და მისი შთამომავლები ხელმისაწვდომია).
- პარალელური (Parallel): მუშაობს მომხმარებლის გორუტინებთან ერთად რამდენიმე ბირთვზე, მინიმუმამდე ამცირებს შეჩერების დროს.
- კონკურენტული (Concurrent): GC-ის უმეტესი ნაწილი ხორციელდება პროგრამის შესრულების დროს.
- დაბალი ლატენციის შეჩერების დრო (Low-latency Stop-The-World): ყველა გორუტინის შეჩერების დრო ძალიან მოკლეა, გამოიყენება მხოლოდ "მარკირების დასაწყისი" (start of marking) და "მარკირების დასრულება" (end of marking) ფაზებში, რათა უზრუნველყოს ობიექტების გრაფის კონსისტენცია.
- განმეორებით გამოყენებადი სკანირება (Stack scanning): სკანირება ასევე ხორციელდება პარალელურად და კონკურენტულად STW-თან ერთად.
- ჰიპის ზრდის მიზანი (Heap growth target): GC ცდილობს შეინარჩუნოს გარკვეული პროცენტი ჰიპის სავსეობის შემდეგ, რათა თავიდან აიცილოს ძალიან ხშირი ან ძალიან იშვიათი ციკლები. ამ ზღვარს მართავს
GOGCცვლადი. ნაგულისხმევი მნიშვნელობააGOGC=100, რაც ნიშნავს, რომ GC იწყება, როდესაც ჰიპის ზომა ორჯერ გაიზარდა.
GC-ის ციკლი შედგება შემდეგ ფაზებისგან:
- GCstart: მოკლე STW ფაზა. განსაზღვრულია ძირეული ობიექტები მარკირებისთვის.
- GCmark: კონკურენტული ფაზა. GC გადის ობიექტების გრაფს და აღნიშნავს ხელმისაწვდომ ობიექტებს (საფერავი -> შავი). გამოიყენება write barrier ცვლილებების თვალსაზრისით მარკირების დროს.
- GCmarktermination: მოკლე STW ფაზა. დასრულდება მარკირება და გადადის sweep-ზე.
- GCsweep: კონკურენტული ფაზა. მიუწვდომელი (თეთრი) ობიექტები გათავისუფლდება. ეს ფაზა შეიძლება შესრულდეს ფონურ რეჟიმში ან საჭიროებისამებრ ახალი მეხსიერების გამოყოფის დროს.
GC ავტომატურად მართავს და უმეტეს შემთხვევაში არ საჭიროებს ხელით გამოძახებას. GC-ის შესრულებას შეიძლება თვალსაზრისი მიეცეს გარემოს ცვლელებით GODEBUG=gctrace=1.
მაგალითი მონიტორინგისთვის:
$ GODEBUG=gctrace=1 go run your_program.go
gctrace გამოსავალი აჩვენებს თითოეული GC ციკლის ინფორმაციას, ფაზების დროს, ჰიპის ზომასა და STW-ის დროს.
GC-ის ოპტიმიზაციისთვის, გარდა GOGC-ის კონფიგურაციის, შეიძლება განიხილოს:
- ალოკაციების რაოდენობის შემცირება (მაგალითად, ბუფერების გადამეორებითი გამოყენება, არასაჭირო გარდაქმნების თავიდან აცილება).
- "escape analysis" პროფილირება, რათა გაიგოთ, რომელ ობიექტებს აქვთ ჰიპზე ალოკაცია.
sync.Pool-ის გამოყენება ხშირად შექმნილი და გათავისუფლებული ობიექტებისთვის.