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:
- Belgini yordamchi: Foydalanuvchi goroutinlari xotira ajratishda yig'uvchiga belgilash bosqichida yordam beradi.
- Belgini: Erishiladigan ob'ektlarning parallel belgilash.
- Belgini yakunlash: Belgini yakunlash uchun qisqa STW bosqichi.
- Qayta ishlash: Erishilmaydigan ob'ektlarni parallel ravishda olib tashlash.
Boshqaruv:
- Avtomatik.
- GC trigger uchun chegaralar
GOGCmuhit 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.