Sobes.tech
Middle+

Go тилинде калдык чогултуучу кантип иштейт?

sobes.tech AI

AIден жооп

Go-ң калдык жыйноочу автоматтык түрдө ишке ашырылат параллелдүү, так эмес (non-generational) ыкма, Mark-and-Sweep алгоритминин негизинде жана кучанын көлөмүнө негизделген триггер менен.

Негизги иштөө принциптери:

  1. Иштетүү триггери: Жыйноочу программалык тарабынан бөлүнгөн эс тутум көлөмү белгиленген чекеден ашканда ишке кирет. Бул чек динамикалык жөнгө салынат.
  2. Белгилөө фазасы (Mark Phase):
    • Жыйноочу белгилөө фазасынын эң маанилүү бөлүгүн (Stop-the-World, STW) токтотот, бирок бул өтө кыска убакытты талап кылат.
    • Иштеп жаткан программа (mutator) менен бирге, жыйноочу объекттер графын корень көрсөтүүчүлөр аркылуу (регистри, глобалдык өзгөрмөлөр, горутин стектери) карайт.
    • Тирүү (жашоо) объекттер белгиленет жана колдонулуп жаткан деп белгиленет.
  3. Жыйноо фазасы (Sweep Phase):
    • Белгилөө фазасы аяктагандан кийин, жыйноочу арендага алынган эс тутумдун тизмесинен (spans) өтөт.
    • Белгиленбеген объекттер калдык деп эсептелет жана алардын эс тутуму бошотулат.
    • Бул фаза да программалык иштөө менен параллелдүү жүргүзүлөт.
  4. Write Barrier: Go программасынын параллелдүү белгилөө фазасы учурунда объекттер графиндеги өзгөртүүлөрдү көзөмөлдөө үчүн write barrier колдонулат. Бул жыйноочу туура иштешин камсыздайт, мындан ары мутациячынын эс тутумундагы өзгөртүүлөргө карабастан.
  5. Поколдор жок: Кээ бир башка тилдерден айырмаланып, Go объекттерди поколдорго бөлбөйт. Жыйноочу бардык кучаны толугу менен иштетет.
  6. Төмөнкү кечигүү максаты: Go GC долбоорлоодо, жыйноо (STW) паузаларынан келип чыккан кечигүүлөрдү минималдаштыруу максаты коюлган, бул сервердик тиркемелер үчүн ылайыктуу кылат.

Параллелдик жана write barrier колдонуу жыйноочу программаны токтотуу убактысын минималдаштырууга жана жогорку иштөө жөндөмдүүлүгүн камсыздоого мүмкүндүк берет.

Жадыны башкаруунун жөнөкөйлөштүрүлгөн мисалы (тура GC эмес, бирок ресурстарды бошотуу көрсөтөт):

package main

import (
	"fmt"
	"os"
)

func main() {
	// Уакыттык ресурсты түзүү мисалы, ал кийинчерээк бошотулат
	file, err := os.Create("temp.txt")
	if err != nil {
		fmt.Println("Файл түзүүдө ката:", err)
		return
	}
	// Файлды жабууну кечиктирүү.
	// Бул таза GC эмес, ресурстарды бошотууну көрсөтөт.
	defer file.Close()

	fmt.Println("'temp.txt' файлы түзүлдү.")

	// Андан соң программа файл менен иштей алат...

	// GC автоматтык түрдө фон режиминде иштейт, колдонулбаган объекттерди чогултат:
	// Мисалы, слайс же карта түзсөк:
	data := make([]int, 1000000) // Кучада бөлүнүү
	_ = data // Колдонуу

	// Эгер data жеткиликтүү болбой калса (мисалы, функциядан чыгуу менен),
	// жыйноочу убакыт өтүп, ал бөлүнгөн эс тутумду бошотот.
}