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.
Görev
KolayGo'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) veData(string dilimi) fields içeren birSessionstruct'ı 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 birNewSessionfunction'ı Create edin. Ayrıca pointer receiver'a sahip, session'ın Data slice'ına bir string appends eden birAddDatamethod'u ve session details'ını gösteren formatted bir string döndüren birSummarymethod'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_dashboardBuradaki 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("")
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi