Özet - GC
- Go kursu
- Uzman
- Ders 12/34
- 4 dk
Tri-color ve GOGC'yi birleştirerek bir bellek analizi yazarsın.
GC özeti
Go GC'si eşzamanlı, üç renkli, işaretle-süpür bir toplayıcıdır. İki kısa STW arasında program çalışmaya devam eder; yazma bariyeri doğruluğu korur. Ayar düğmeleri GOGC (ne sıklıkla) ve GOMEMLIMIT (ne kadar), ölçüm araçları gctrace, ReadMemStats ve heap profilidir.
Ama en büyük kazanç kodu değiştirmekten gelir: daha az ve daha kısa ömürlü heap ayırması.
Ölç, sonra ayarla
Tipik bir inceleme: gctrace=1 ile GC'nin CPU'nun yüzde kaçını aldığına bak; yüksekse alloc_space heap profiliyle en çok ayıran satırları bul; onları düzelt; gerekirse son adımda GOGC/GOMEMLIMIT ile ince ayar yap. Ayarları önce değiştirmek sorunu gizler, çözmez.
Uygulama Ayırma karşılaştırması
testing.AllocsPerRun ile iki fonksiyonu karşılaştır: biri her çağrıda make([]int, 0) ile başlayıp 100 eleman ekler, diğeri make([]int, 0, 100) ile kapasiteli başlar. Kapasiteli olanın ayırmasının 1 olduğunu ve diğerinden az olduğunu yazdır.
Başlangıç kodu
package main
import (
"fmt"
"testing"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"testing"
)
var sink []int
func main() {
a := testing.AllocsPerRun(10, func() {
s := make([]int, 0)
for i := 0; i < 100; i++ {
s = append(s, i)
}
sink = s
})
b := testing.AllocsPerRun(10, func() {
s := make([]int, 0, 100)
for i := 0; i < 100; i++ {
s = append(s, i)
}
sink = s
})
fmt.Println(b, b < a)
}Beklenen çıktı
1 true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Go GC'si nesneleri bellekte taşır (compaction) mı?
- Hayır; Go GC'si taşımaz, parçalanmayı boyut sınıflarıyla azaltır Doğru cevap
- Evet, her döngüde
- Yalnızca büyük nesneleri
- Yalnızca GOGC=off iken
Açıklama: Go taşımayan bir GC kullanır; ayırıcı nesneleri boyut sınıflarına göre sayfalara yerleştirerek parçalanmayı düşük tutar.
2 Bellek sınırı
debug.____(900 << 20) // ~900 MiB
debug.SetMemoryLimit(900 << 20) // ~900 MiB
Açıklama: SetMemoryLimit GOMEMLIMIT'in kod içindeki karşılığıdır.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
Tri-color |
İşaretleme algoritması |
Write barrier |
Eşzamanlı doğruluk |
GOGC |
GC sıklığı |
sync.Pool |
Ayırmayı azaltır |