Garbage Collection and Golang

Furkan Samaraz
3 min readAug 23, 2022

Merhaba bugün golang da “Garbage Collection” kavramını işleyeceğiz yani “Çöp toplama”.

Gargen Collection Nedir?

Gargen Collection(çöp toplama), Go geliştiricilerinin yakın zamanda tahsis edilen ancak artık ihtiyaç duyulmayan bellek alanını bulmak için kullandıkları bir mekanizmadır, bu nedenle aynı alan üzerinde daha fazla tahsisin yapılabilmesi veya belleğin yeniden kullanmak içindir.

Hafıza Depolama?

Çalışan bir program nesneleri iki farklı hafıza bölümünde depolar, bunlardan biri HEAP diğeri ise STACK olarak adlandırılır.

Garbage Collection’ın işi STACK’la değil, HEAP iledir. Stack son giren ilk çıkar mantığına dayanan ve fonksiyon değerlerini saklayan bir veri yapısıdır. Bir fonksiyonun içinden başka bir fonksiyonu çağırmak STACK’da o fonksiyonun değerlerini saklayan yeni bir çerçeve açar ve bu böyle gider.

Golang veri yapısı olarak Heap kullanır.

Heap ve Stack ise;

Stack’de değer tipleri, pointer ve adresler saklanırken Heap’de ise referans değerleri saklanır. Stack daha hızlıdır. Ulaşılmak istenen veriler ard arda sıralanmış olur. Heap ortak olarak kullanılır ve uygulama başlatıldığında başlar. HEAP’e kaydedilmesi gereken bir nesne tanımladığınızda gereken hafıza ayrılır ve bir pointer geri döndürülür. HEAP temizlenmezse program çalıştıkça büyümeye devam eder.

Örnek ile açıklayalım;

Örnek için hafızanın durumunu görüntülemek için golang standart kütüphaneleri içinde gelen runtime’ı kullanacağız.

Temel olarak runtime kütüphanesinin MemStats metodunu kullanarak hafıza durumu ile ilgili istatistikleri elde edip bunları ekrana basan bir fonksiyonumuz var.(statistics)

Çıktıya bakıyoruz local olarak tanımladığımız “T []byte” dizisi bellek tarafını nasıl etkiliyor. Örneği biraz daha değiştiriyoruz.

Ne değiştir?? ne oldu da bellek arttı neden mi? Bir değişkeni global olarak tanımladığımızda Garbage Collector yaşam süresi hakkında bir ön görüde bulunamıyor ve bu tip değerleri daha nadir temizlemeyi tercih ediyor ve bu yüzden bellek şişiyor. Şimdi ki örnek ile istediğimiz sonuçu elde edeceğiz bakalım.

Gördüğünüz gibi yine 10 defa çalışan Garbage Collector ve benzer miktarda toplam ayrılmış hafıza değerleri görüyoruz. Fakat anlık ayrılan hafıza başlangıçtaki sıfır değerinde. “T” değişkenini for’un içinde tanımladığımız ve for döngüsünden çıkıldığında artık kullanılmadığı için Go onu Garbage Collection sürecine soktu ve artık işe yaramadığı için hafızayı boşalttı. Yani Go Garbage Collection sürecinde fonksiyon ve döngü scope’larını da dikkate alarak ilgili değerin yaşam sürecini (lifetime) hesaplıyor ve artık işe yaramayacaksa ilgili hafıza alanını boşaltıyor.

Yani çağırdığınız bir fonksiyon içerisinde yerel olarak tanımlanmış değişkenlerde aynı süreçten geçiyor. Ön yinelemeli (Recursive) fonksiyonlar olmadıkça fonksiyonlardaki yerel değişkenlerin kapladıkları yer GO için çok sorun teşkil etmeyecek.

Bir sonraki yazım da görüşmek üzere..

--

--