Middle+
Go dasturlash tilida axlat to'plovchi qanday ishlaydi?
sobes.tech AI
AIdan javob
Go'dagi axirjog'och to'plovchi, belgilash va tozalash algoritmiga asoslangan bo'lib, xotira ajratish asosida ishlaydi. U asosiy dastur bilan parallel ishlaydi va pauzalarni minimallashtiradi.
Asosiy nuqtalar:
- Uchta rang to'plami:
- Oq: Tashrif buyurilmagan va potentsial axlat bo'lgan ob'ektlar.
- Kulrang: O'sha ildizlardan kirish mumkin bo'lgan, ammo hali skanerlashmagan ob'ektlar.
- Qora: O'sha ildizlardan kirish mumkin bo'lgan va allaqachon skanerlashgan ob'ektlar.
- Belgilang: To'plovchi ildizlardan (globallashgan o'zgaruvchilar, har bir goroutine yordami) boshlanadi va kirish mumkin bo'lgan ob'ektlarni kulrangga belgilaydi. Keyin u rekursiv ravishda kulrang ob'ektlarni skanerlash, ulardan kirish mumkin bo'lganlarni kulrangga belgilash va skanerlashgan ob'ektlarni qora qilish.
- STW fazasi (Dastur to'xtatish) belgilanganda: Belgilashning boshlanishida va oxirida, ob'ektlar grafigining suratini olish uchun barcha goroutine'larning bajarilishi qisqa vaqt to'xtatiladi.
- Parallel belgilang: Belgashning katta qismi dastur bajarilishi bilan parallel ravishda amalga oshiriladi.
- Olib tashlash: Belgilashdan so'ng, qolgan oq ob'ektlar kirish mumkin emas deb hisoblanadi va bo'shatiladi. Go ochiq ko'rsatkichlarni nolga o'rnatishni talab qilmaydi.
// Misol: ob'ekt kirish mumkin bo'lsa
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Ob'ekt yaratilgan, kirish mumkin
_ = d1 // Ob'ektni ishlatish
d1 = nil // Ob'ekt endi d1 o'zgaruvchisidan kirish mumkin emas.
// Axirjog'och to'plovchi uni keyingi siklda bo'shatishi mumkin.
// Boshqa ob'ektlar, ularga hech kim murojaat qilmasa, ham to'planishi mumkin.
}
- Trigger: To'plovchi, ajratilgan xotira miqdori avvalgi ajratilgan xotira miqdoridan oshganda ishga tushadi. Standartda, bu chegaraning ikki barobar ko'pi avvalgi foydalanilgan xotira miqdori.
- Ma'goal: Uzoq davom etadigan "Stop-The-World" pauzalarni oldini olib, past kechikishni ta'minlash.
// To'plovchining xulqini muhit o'zgaruvchilari orqali boshqarish mumkin
// masalan, GOGC=off ni o'rnatish, axlat to'plashni deaktivatsiya qiladi.
Umuman olganda, Go'dagi axlat to'plovchi samarali bo'lib, dasturchidan minimal ishtirokni talab qiladi.