CodeBlanks Logo Icon CodeBlanks

GC ve bellek

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 make ile kapasite ver.
  • Geçici tamponları sync.Pool ile yeniden kullan.
  • Sıcak döngülerde gereksiz any dö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

main.go
package main

import (
    "bytes"
    "fmt"
    "sync"
)

func main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
b := havuz.Get().(*bytes.Buffer)
b.Reset()
// ...
havuz.____(b)
Cevap
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

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