Sobes.tech
Middle

Go tilida axlat yig'uvchi haqida bilimingiz qanday?

sobes.tech AI

AIdan javob

Golang paralel va kamroq kechikishli chiqindilarni yig'uvchi algoritmga asoslangan mark-sweep algoritmiga asoslangan tozalashni ishlatadi.

Asosiy xususiyatlar:

  1. Uch-rangli algoritm (Three-color algorithm): Ob'ektlarni uch rang bilan belgilaydi: oq (potensial chiqindi), kulrang (muvaffaqiyatli, ammo uning vorislari tekshirilmagan ob'ektlar) va qora (muvaffaqiyatli ob'ekt va uning vorislari).
  2. Paralellik (Parallel): Foydalanuvchi goroutinlari bilan birga ko'p yadroda ishlaydi, to'xtash vaqtini minimallashtiradi.
  3. Ko'rsatkichlik (Concurrent): GC ning katta qismi dastur bajarilishi bilan bir vaqtda bajariladi.
  4. Past kechikishli to'xtash vaqti (Low-latency Stop-The-World): Barcha goroutinlarning to'xtash vaqti (STW) juda qisqa, faqat "marc qilish boshlanishi" (start of marking) va "marc qilish tugashi" (end of marking) uchun ishlatiladi, ob'ektlar grafigining barqarorligini ta'minlash uchun.
  5. Stack skanerlashni qayta ishlatish (Stack scanning): Stack skanerlash ham parallel va STW bilan bir vaqtda amalga oshiriladi.
  6. Heap o'sish maqsadi (Heap growth target): GC har bir tsikldan so'ng heap to'ldirish foizini ma'lum darajada ushlab turishga harakat qiladi, shuning uchun juda tez yoki juda sekin tsikllardan qochish uchun. Bu chegarani GOGC o'zgaruvchisi orqali boshqarish mumkin. Standart qiymat GOGC=100, bu heap hajmi ikki baravar oshganda GC ishga tushishini anglatadi.

GC ish jarayoni quyidagi fazalardan iborat:

  1. GCstart: Qisqa STW fazasi. Markirovka uchun ildiz ob'ektlar aniqlanadi.
  2. GCmark: Ko'rsatkichli faza. GC ob'ektlar grafigini yurib, erishilgan ob'ektlarni (kulrang rang -> qora) belgilaydi. Markirovka davomida grafiga o'zgarishlarni kuzatish uchun write barrier ishlatiladi.
  3. GCmarktermination: Qisqa STW fazasi. Markirovka tugallangach, write barrier dan sweep ga o'tiladi.
  4. GCsweep: Ko'rsatkichli faza. Erishilmaydigan (oq) ob'ektlar bo'shatiladi. Bu faza fon rejimida yoki yangi xotira ajratish paytida amalga oshirilishi mumkin.

Go'dagi GC avtomatik boshqariladi va ko'p hollarda qo'lda chaqirish talab qilinmaydi. GC ning ishlashini GODEBUG=gctrace=1 muhit o'zgaruvchilari bilan kuzatish mumkin.

Monitoring uchun misol:

$ GODEBUG=gctrace=1 go run your_program.go

gctrace chiqishi har bir GC tsikli haqida faza vaqtlarini, heap hajmini va STW vaqtini ko'rsatadi.

GC ni optimallashtirish uchun, GOGC ni sozlashdan tashqari, quyidagilarni ko'rib chiqish mumkin:

  • Ajratishlarni kamaytirish (masalan, buferlarni qayta ishlatish, keraksiz konvertatsiyalarni oldini olish).
  • "escape analysis" profilingini o'tkazish, qaysi ob'ektlar heapga ajratilishini tushunish.
  • Tez-tez yaratiladigan va bo'shatiladigan ob'ektlar uchun sync.Pool dan foydalanish.