GC ve bellek
- Go kursu
- Uzman
- Ders 11/34
- 4 dk
Heap ve stack ayrımını ve escape'ı öğrenirsin.
Ayırmayı azaltmak
GC maliyeti, ayırma hızıyla ve canlı heap büyüklüğüyle orantılıdır. En etkili GC ayarı daha az ayırmaktır:
- Dilim ve map'lere
makeile kapasite ver. - Geçici tamponları
sync.Poolile yeniden kullan. - Sıcak döngülerde gereksiz
anydönüşümünden (boxing) kaçın. - Küçük struct'ları işaretçi yerine değer olarak taşı.
sync.Pool kullanımı
Havuzdan alınan nesne kullanılmadan önce sıfırlanmalı, iş bitince geri konmalıdır:
var tampon = sync.Pool{New: func() any { return new(bytes.Buffer) }}
b := tampon.Get().(*bytes.Buffer)
b.Reset()
b.WriteString("yanıt")
// ... kullan ...
tampon.Put(b)Çok büyük tamponları geri koymamak, tek bir büyük isteğin havuzu şişirmesini engeller.
Uygulama Havuzlu tampon
sync.Pool ile *bytes.Buffer havuzu kur (New alanıyla). Havuzdan al, Reset et, "merhaba" yaz, içeriği yazdır ve Put ile geri koy.
Başlangıç kodu
package main
import (
"bytes"
"fmt"
"sync"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"bytes"
"fmt"
"sync"
)
var havuz = sync.Pool{New: func() any { return new(bytes.Buffer) }}
func main() {
b := havuz.Get().(*bytes.Buffer)
b.Reset()
b.WriteString("merhaba")
fmt.Println(b.String())
havuz.Put(b)
}Beklenen çıktı
merhaba
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>sync.Pool</code>'daki nesnelere ne olabilir?
- Kopyalanır
- GC sırasında atılabilir; havuz kalıcı önbellek değildir Doğru cevap
- Sonsuza kadar saklanır
- Diske yazılır
Açıklama: Pool, GC döngülerinde içini boşaltabilir; yalnızca yeniden oluşturulabilen geçici nesneler için uygundur.
2 Havuza geri koy
b := havuz.Get().(*bytes.Buffer)
b.Reset()
// ...
havuz.____(b)
b := havuz.Get().(*bytes.Buffer)
b.Reset()
// ...
havuz.Put(b)
Açıklama: Put nesneyi havuza bırakır; sonraki Get onu yeniden kullanabilir.
3 Teknik ve kazanç
| Kavram | Anlamı |
|---|---|
make(..., 0, n) |
Büyüme kopyası yok |
sync.Pool |
Tampon yeniden kullanımı |
Değer struct |
Heap ayırma yok |
strings.Builder |
Az ara string |