Sobes.tech
Middle+

Go tilida chiqindilarni yiguvchi (garbage collector) haqida gapir.

sobes.tech AI

AIdan javob

Go parallel, uchta, uchta, va yeng kamchilikli tozalash yig'uvchisi bilan ishlaydi.

Asosiy ishlash prinsiplari:

  • Belgilash (Mark): Kichikdan (root) ko'rsatkichlar (reyestrlar, goroutinlar yiginlari, global o'zgaruvchilar) orqali erishiladigan ob'ektlarni aniqlaydi. Uch rangli algoritm ishlatiladi (oq - tashrif buyurilmagan, kul - tashrif buyurilgan, ammo avlodlar hali tekshirilmagan, qora - tashrif buyurilgan va barcha avlodlar tekshirilgan).
  • Qidirish (Sweep): Erishilmaydigan ob'ektlarni (oq qolganlar) olib tashlaydi va xotirani qayta ishlatish uchun bo'shatadi.

Xususiyatlar:

  • Paralel: Belgilash, foydalanuvchi kodining bajarilishi bilan parallel ravishda amalga oshadi (STW - Stop-The-World - bosqichlari juda qisqa).
  • Past kechikishlar: Ilovaning ishlashida to'xtashlarni minimallashtirish uchun ishlab chiqilgan.
  • Kompaktsiz emas: Yashayotgan ob'ektlarni xotirada ko'chirmaydi, bu bo'laklanishga olib kelishi mumkin, ammo amalga oshirishni soddalashtiradi va belgilash/qayta ishlashni tezlashtiradi.

Ishlash bosqichlari:

  1. Belgini yordamchi: Foydalanuvchi goroutinlari xotira ajratishda yig'uvchiga belgilash bosqichida yordam beradi.
  2. Belgini: Erishiladigan ob'ektlarning parallel belgilash.
  3. Belgini yakunlash: Belgini yakunlash uchun qisqa STW bosqichi.
  4. Qayta ishlash: Erishilmaydigan ob'ektlarni parallel ravishda olib tashlash.

Boshqaruv:

  • Avtomatik.
  • GC trigger uchun chegaralar GOGC muhit o'zgaruvchisi yordamida boshqariladi. Standart holatda, GOGC=100, bu shuni anglatadiki, yig'ish avvalgi siklga nisbatan ikki barobar bo'lsa boshlanadi.
  • runtime.GC() funksiyasi majburan yig'ishni boshlaydi, ammo uning foydalanilishi standart kodda tavsiya etilmaydi.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Majburiy GC chaqiruvining misoli (kam hollarda talab qilinadi)
	runtime.GC()

	// GC statistikalarini olish misoli
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Jami ajratilgan xotira: %v bayt\n", memStats.TotalAlloc)
}

Afzalliklari:

  • Avtomatik xotira boshqaruvi, xatolik ehtimolini kamaytiradi (xotira oqibati, ikki marta bo'shatish).
  • Raqobatli bajarishga mo'ljallangan.

Kamchiliklari:

  • GC ning nondeterministik ish vaqti.
  • Qo'lda boshqarishga nisbatan xotira iste'moli oshishi mumkin.