CodeBlanks Logo Icon CodeBlanks

Özet - GC

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

main.go
package main

import (
    "fmt"
    "testing"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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ı

Soru
debug.____(900 << 20)  // ~900 MiB
Cevap
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

Uzman bölümündeki tüm dersler