Escape Analysis: Belleğin Stack mi Heap mi Olduğuna Karar Verme
Go derleyicisinin "Bu değişken fonksiyondan kaçtı mı?" dedektifliği.
Bir toplantıda aldığın geçici not masada kalır (Stack). Ama toplantıdan sonra patrona verdiğin rapor şirketin ortak arşivine kaldırılır (Heap).
Go derleyicisi derleme anında (go build -gcflags="-m") Escape Analysis yapar. Bir fonksiyonun içinde üretilen değişkenin adresi (pointer) fonksiyon dışına döndürülürse değişken Stack'ten Heap'e kaçar (escapes to heap). Heap'e giden nesneler Garbage Collector tarafından toplanır.
“Stack tahsisleri sıfır maliyetlidir çünkü fonksiyon bitince Stack pointer geri çekilir. Heap tahsisleri ise GC yükü yaratır. Go derleyicisi bir nesnenin ömrünün fonksiyon kapsamını aştığını tespit ederse onu otomatik olarak Heap'e taşır.”
func createPointer() *int {
x := 42
return &x // x fonksiyon dışına kaçtı! Heap'e taşınır (Escaped to heap)
}
func createValue() int {
y := 42
return y // Stack'te kopyalanır, GC yükü yok!
}
Her şeyi pointer ile dönmenin her zaman daha hızlı olduğunu sanmak; bazen küçük struct'ları değer olarak dönmek Heap tahsisini önlediği için çok daha hızlıdır.