Middle
Go тилиндеги калдык чогултуучу жөнүндө эмне билесиз?
sobes.tech AI
AIден жооп
Golang параллелдүү жана төмөн кечиктирүүчү калдык чогултуучу алгоритмге негизделген mark-sweep негизделген.
Негизги өзгөчөлүктөрү:
- Үч-түс алгоритми (Three-color algorithm): Объекттерди үч түстө белгилейт: ак (мүмкүнчүлүк калдык), боз (объект жеткиликтүү, бирок анын мураскорлору текшерилген эмес) жана кара (объект жана анын мураскорлору жеткиликтүү).
- Параллелдик (Parallel): Колдонуучу горутиндер менен бирге иштейт көп ядролук режимде, токтоп калуу убактысын минималдаштырып.
- Конкуренттик (Concurrent): GCнин көбү иши программаны иштетип жатканда аткарылат.
- Төмөн кечиктирүү менен токтоп калуу (Low-latency Stop-The-World): Бардык горутиндердин токтоп калуу убактысы өтө кыска, ал "белгилөө башталышы" (start of marking) жана "белгилөө аяктоосу" (end of marking) фазаларында гана колдонулат, объекттер графинин туруктуулугун камсыздоо үчүн.
- Кайталап колдонулуучу сканерлөө (Stack scanning): Стек сканерлөө да параллелдүү жана конкуренциялык түрдө STW менен бирге жүргүзүлөт.
- Гиптин өсүү максаты (Heap growth target): GC белгилүү пайыз гиптин толуусун сактоого умтулат, бул өтө тез же өтө сейрек циклдерден сактануу үчүн. Бул чек
GOGCаркылуу көзөмөлдөнөт. Бөлүнгөн маанисиGOGC=100, бул гиптин өлчөмү эки эсе көбөйгөндө GC иштетилет.
GCтин иштөө цикли төмөнкү фазалардан турат:
- GCstart: Кыска STW фазасы. Белгилөө үчүн тамыр объекттер аныкталат.
- GCmark: Конкуренттик фазасы. GC объекттер графин өтүп, жеткиликтүү объекттерди белгилейт (сары түс -> кара түс). Белгилөө учурунда өзгөртүүлөрдү көзөмөлдөө үчүн write barrier колдонулат.
- GCmarktermination: Кыска STW фазасы. Белгилөө аяктап, sweepке өтөт.
- GCsweep: Конкуренттик фазасы. Жеткиликтүү эмес (ак) объекттер бошотулат. Бул фаза фон режиминде же жаңы эс тутум бөлүүдө керек болгондо жүргүзүлөт.
GC автоматтык түрдө башкарылат жана көбүнчө кол менен чакырууну талап кылбайт. GCдин аткарымдүүлүгүн GODEBUG=gctrace=1 орто чөйрө өзгөрмөлөрү аркылуу көзөмөлдөсө болот.
Мисал:
$ GODEBUG=gctrace=1 go run your_program.go
gctrace чыгуу ар бир GC циклинин маалыматын көрсөтөт, фазалардын убактысы, гиптин өлчөмү жана STW убактысы кирет.
GCти оптималдаштыруу үчүн, GOGC орнотуусунан тышкары, төмөнкүлөрдү карап чыгуу керек:
- Алокацияларды азайтуу (мисалы, буферлерди кайра колдонуу, зарыл эмес түрленүүлөрдөн качуу).
- "Escape analysis" профилинги, кайсы объекттер гипте алокатталганын түшүнүү үчүн.
sync.Poolколдонуу, көп колдонулган жана бошотулган объекттер үчүн.