Sobes.tech
Middle+

Go dilinde çöp toplayıcı nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'daki çöp toplayıcı, paralel, kesin olmayan (non-generational) bir yöntemi uygular ve bu, Mark-and-Sweep algoritmasına dayanır; bu algoritma, yığın hacmi tetikleyicisine sahiptir.

Temel çalışma prensipleri:

  1. Tetikleyici: Çöp toplayıcı, program tarafından tahsis edilen bellek hacmi belirli bir eşiği aştığında başlar ve bu eşik dinamik olarak ayarlanır.
  2. İşaretleme Aşaması (Mark Phase):
    • Çöp toplayıcı, yalnızca kritik Mark aşamasını durdurur (Stop-the-World, STW), ancak bu çok kısa sürer.
    • Paralel olarak, çalışan programla (mutator) kök göstergelerden (kayıtlar, küresel değişkenler, goroutine yığınları) nesne grafını tarar.
    • Ulaşılabilir (canlı) nesneler işaretlenir.
  3. Tarama Aşaması (Sweep Phase):
    • Mark aşaması tamamlandıktan sonra, çöp toplayıcı hafıza spanleri listesini tarar.
    • İşaretlenmemiş nesneler çöp olarak kabul edilir ve belleği serbest bırakılır.
    • Bu aşama da program çalışırken paralel olarak gerçekleştirilir.
  4. Yazma Bariyeri (Write Barrier): Go, paralel mark aşaması sırasında nesne grafındaki değişiklikleri izlemek için yazma bariyeri kullanır. Bu, mutator tarafından yapılan bellek değişikliklerine rağmen çöp toplayıcının doğru çalışmasını sağlar.
  5. Gelişmiş nesil yoktur: Bazı diğer dillerin aksine, Go nesneleri nesil olarak ayırmaz. Çöp toplayıcı, tüm yığını tek seferde işler.
  6. Düşük gecikme hedefi: Go GC tasarımında, çöp toplama (STW) nedeniyle oluşan gecikmeleri en aza indirmek hedeflenmiştir; bu, onu sunucu uygulamaları için uygun kılar.

Paralellik ve yazma bariyerinin kullanımı, çöp toplayıcının program duraklamalarını en aza indirmesini sağlar ve yüksek performans sağlar.

Basitleştirilmiş bellek yönetimi örneği (doğrudan GC değil, ancak kaynakların serbest bırakılmasını gösterir):

package main

import (
	"fmt"
	"os"
)

func main() {
	// Geçici bir kaynağın oluşturulması ve serbest bırakılması örneği
	file, err := os.Create("temp.txt")
	if err != nil {
		fmt.Println("Dosya oluşturma hatası:", err)
		return
	}
	// Dosyanın gecikmeli kapanması.
	// Bu, doğrudan GC olmasa da, kaynakların serbest bırakılmasını gösterir.
	defer file.Close()

	fmt.Println("'temp.txt' dosyası oluşturuldu.")

	// Daha sonra program dosya ile çalışabilir...

	// GC, arka planda otomatik olarak çalışır ve kullanılmayan nesneleri yığından toplar.
	// Örneğin, bir dilim veya harita oluşturulursa:
	data := make([]int, 1000000) // Yığın tahsisi
	_ = data // Kullanım

	// data erişilebilir olmaktan çıkarsa (örneğin, fonksiyondan çıkarken),
	// çöp toplayıcı zamanla tahsis edilen belleği serbest bırakır.
}