Menu
Coddy logo textTech

Go'da Garbage Collection

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 23 / 107.

C veya C++ gibi dillerin aksine Go, bellek yönetimini çöp toplama (GC) aracılığıyla otomatik olarak gerçekleştirir. İşiniz bittiğinde belleği manuel olarak serbest bırakmanız gerekmez. Go çalışma zamanı, hangi belleğin hâlâ kullanımda olduğunu izler ve geri kalanını geri kazanır.

new(), make() kullanarak veya değişkenler oluşturarak bellek ayırdığınızda, Go'nun çöp toplayıcısı bu ayırmaları izler. Bir değer programınızın herhangi bir bölümü tarafından artık erişilebilir olmadığında, GC bu belleği otomatik olarak serbest bırakır.

func createPerson() *Person {
    p := &Person{Name: "Alice", Age: 30}
    return p  // p heap'e kaçar, GC onu yönetir
}

func main() {
    person := createPerson()
    fmt.Println(person.Name)
    // person artık kullanılmadığında, GC belleği geri alır
}

Bu örnekte, Person yapısı işlevden döndürüldüğü için heap üzerinde ayrılır. Go derleyicisi, bir değişkenin stack üzerinde kalıp kalamayacağını veya heap'e taşınması gerekip gerekmediğini belirlemek için kaçış analizi gerçekleştirir. Çöp toplayıcı yalnızca heap belleğini yönetir.

Bu otomatik bellek yönetimi, unutulan bellek serbest bırakma işlemlerinden kaynaklanan bellek sızıntıları konusunda endişelenmeden uygulamanızı oluşturmaya odaklanabilmenizi sağlar. Ancak GC'nin var olduğunu anlamak, performansın önemli olduğu durumlarda gereksiz bellek tahsislerini en aza indirerek daha verimli kod yazmanıza yardımcı olur.

challenge icon

Görev

Kolay

Go'nun heap'e kaçan nesneler için belleği nasıl yönettiğini gösteren bir session manager oluşturalım. Dinamik olarak tahsis edilen ve function'lardan döndürülen session'lar oluşturacak, böylece GC bunların yaşam döngüsünü yönetecek.

Code'unuzu iki dosyada organize edeceksiniz:

  • session.go: ID (string), Username (string) ve Data (string dilimi) fields içeren bir Session struct'ı Define edin. Bir ID ve username alan, heap üzerinde yeni bir Session tahsis eden (pointer döndürerek) ve Data slice'ını empty olarak başlatan bir NewSession function'ı Create edin. Ayrıca pointer receiver'a sahip, session'ın Data slice'ına bir string appends eden bir AddData method'u ve session details'ını gösteren formatted bir string döndüren bir Summary method'u ekleyin.
  • main.go: Input'tan session bilgilerini okuyun, constructor function'ınızı kullanarak bir session Create edin, buna bazı data entries ekleyin ve session özetini görüntüleyin. Session bir function'ın içinde oluşturulup pointer olarak döndürüldüğü için, garbage collector'ın onu manage edeceği heap'e kaçar.

Aşağıdaki input'lar sağlanacaktır:

  • Satır 1: Session ID
  • Satır 2: Username
  • Satır 3: Eklenecek first data entry
  • Satır 4: Eklenecek second data entry

Summary method'unuz şu formatta bir string döndürmelidir:

Session [ID] for user [Username]
Data entries: [count]
- [entry1]
- [entry2]

Örneğin sess-001, alice, login ve view_dashboard verildiğinde output'unuz şu olmalıdır:

Session sess-001 for user alice
Data entries: 2
- login
- view_dashboard

Buradaki temel fikir, NewSession function'ının bir Session Create etmesi ve ona bir pointer döndürmesidir. Bu, Session'ın stack'te kalmak yerine heap'e "escape" etmesine neden olur; böylece ona yönelik hiçbir reference kalmadığında garbage collection için uygun hale gelir. Code'unuzun bu memory'yi manuel olarak free etmesi gerekmez: Go bunu automatically halleder.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Oturum ID'sini oku
	sessionID, _ := reader.ReadString('\n')
	sessionID = sessionID[:len(sessionID)-1]

	// Kullanıcı adını oku
	username, _ := reader.ReadString('\n')
	username = username[:len(username)-1]

	// İlk veri girişini oku
	data1, _ := reader.ReadString('\n')
	data1 = data1[:len(data1)-1]

	// İkinci veri girişini oku
	data2, _ := reader.ReadString('\n')
	data2 = data2[:len(data2)-1]

	// TODO: NewSession fonksiyonunu kullanarak yeni bir oturum oluştur
	// Bir işaretçi döndürdüğümüz için oturum heap'e kaçacak

	// TODO: AddData metodunu kullanarak veri girişlerini oturuma ekle

	// TODO: Summary metodunu kullanarak oturum özetini yazdır
	fmt.Println("")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi