Sobes.tech
Middle

რა იცით Go ენის გატეხის შესახებ?

sobes.tech AI

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

Golang პარალელური და დაბალი ლატენციის მტვრის შეგროვების ალგორითმზე დაფუძნებული mark-sweep-ის გამოყენებას ახდენს.

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

  1. სამფეროვანი ალგორითმი (Three-color algorithm): ობიექტებს სამ ფერად აღნიშნავს: თეთრი (პოტენციური ნაგავი), ნაცრისფერი (ობიექტი ხელმისაწვდომია, მაგრამ მისი შთამომავლები არ არის შემოწმებული) და შავი (ობიექტი და მისი შთამომავლები ხელმისაწვდომია).
  2. პარალელური (Parallel): მუშაობს მომხმარებლის გორუტინებთან ერთად რამდენიმე ბირთვზე, მინიმუმამდე ამცირებს შეჩერების დროს.
  3. კონკურენტული (Concurrent): GC-ის უმეტესი ნაწილი ხორციელდება პროგრამის შესრულების დროს.
  4. დაბალი ლატენციის შეჩერების დრო (Low-latency Stop-The-World): ყველა გორუტინის შეჩერების დრო ძალიან მოკლეა, გამოიყენება მხოლოდ "მარკირების დასაწყისი" (start of marking) და "მარკირების დასრულება" (end of marking) ფაზებში, რათა უზრუნველყოს ობიექტების გრაფის კონსისტენცია.
  5. განმეორებით გამოყენებადი სკანირება (Stack scanning): სკანირება ასევე ხორციელდება პარალელურად და კონკურენტულად STW-თან ერთად.
  6. ჰიპის ზრდის მიზანი (Heap growth target): GC ცდილობს შეინარჩუნოს გარკვეული პროცენტი ჰიპის სავსეობის შემდეგ, რათა თავიდან აიცილოს ძალიან ხშირი ან ძალიან იშვიათი ციკლები. ამ ზღვარს მართავს GOGC ცვლადი. ნაგულისხმევი მნიშვნელობაა GOGC=100, რაც ნიშნავს, რომ GC იწყება, როდესაც ჰიპის ზომა ორჯერ გაიზარდა.

GC-ის ციკლი შედგება შემდეგ ფაზებისგან:

  1. GCstart: მოკლე STW ფაზა. განსაზღვრულია ძირეული ობიექტები მარკირებისთვის.
  2. GCmark: კონკურენტული ფაზა. GC გადის ობიექტების გრაფს და აღნიშნავს ხელმისაწვდომ ობიექტებს (საფერავი -> შავი). გამოიყენება write barrier ცვლილებების თვალსაზრისით მარკირების დროს.
  3. GCmarktermination: მოკლე STW ფაზა. დასრულდება მარკირება და გადადის sweep-ზე.
  4. GCsweep: კონკურენტული ფაზა. მიუწვდომელი (თეთრი) ობიექტები გათავისუფლდება. ეს ფაზა შეიძლება შესრულდეს ფონურ რეჟიმში ან საჭიროებისამებრ ახალი მეხსიერების გამოყოფის დროს.

GC ავტომატურად მართავს და უმეტეს შემთხვევაში არ საჭიროებს ხელით გამოძახებას. GC-ის შესრულებას შეიძლება თვალსაზრისი მიეცეს გარემოს ცვლელებით GODEBUG=gctrace=1.

მაგალითი მონიტორინგისთვის:

$ GODEBUG=gctrace=1 go run your_program.go

gctrace გამოსავალი აჩვენებს თითოეული GC ციკლის ინფორმაციას, ფაზების დროს, ჰიპის ზომასა და STW-ის დროს.

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

  • ალოკაციების რაოდენობის შემცირება (მაგალითად, ბუფერების გადამეორებითი გამოყენება, არასაჭირო გარდაქმნების თავიდან აცილება).
  • "escape analysis" პროფილირება, რათა გაიგოთ, რომელ ობიექტებს აქვთ ჰიპზე ალოკაცია.
  • sync.Pool-ის გამოყენება ხშირად შექმნილი და გათავისუფლებული ობიექტებისთვის.