Çöp toplayıcı (GC), bir bellek yöneticisidir. Birçok programlama dili yerleşik bir GC’ye sahiptir. Bu özellik, bir programdaki belleği otomatik olarak tahsis eder ve yeniden tahsis eder. Uygulamanızı yavaşlatan bağlı, kullanılmayan belleği serbest bırakır.

Çöp Toplayıcı Nasıl Çalışır?

GC’nin güzelliği, sizin hiçbir şey yapmanıza gerek kalmadan sizin adınıza hafızayı serbest bırakmasıdır. Bu nedenle, bunu o kadar önemli bir özellik olarak düşünebilirsiniz ki, her programlama dilinde buna sahip olmasını beklersiniz. Ne yazık ki, bu durum böyle değil; C gibi popüler bir dil bile bir GC’den yoksun olabilir.

Bellek Tahsisi Nasıl Çalışır?

Herhangi bir programlama dilinde bir program çalıştırdığınızda, işletim sisteminiz o program için bellekte bir veri yığını ayırır . Bu program, yürütmeyi tamamlayana kadar bu veri yığınının sahibidir ve bu yığını işgal eder. Programınız mevcut olandan daha fazla belleğe ihtiyaç duyarsa, işletim sisteminin bellek yığınından dinamik olarak daha fazla bellek ayırabilir.

Programlamada, bir değişken bir bellek konumunu temsil eder. Böylece yeni bir değişken tanımladığınızda programlama dili bu değişken için bellekte yer ayırır. Değişken artık bir hafıza adresine sahip olacaktır. Bu değişkene bir değer atayana kadar, başlatılmamış olarak kalacaktır ve bazı çöp değerler içerebilir.

Bir programlama dili, bir değişkeni başlatmadan bildirmenize izin veriyorsa, bu dinamik bir değişkendir. Bu, değişkene atadığınız değerin zaman içinde değişebileceği anlamına gelir. Ancak değişkenin bellek konumu, siz onu yeniden konumlandırana kadar aynı kalacaktır.

Bellek Dağıtma Nasıl Çalışır?

Bellek tahsisi, tüm programlama dilleri için benzer bir işlemdir. Ancak karşılık gelen bellek ayırma yöntemi farklı olma eğilimindedir. İki tür bellek ayırma yöntemi vardır; manuel ve otomatik. Bir GC, otomatik olarak ayırma işlemini gerçekleştirir.

Çöp Toplayıcı Olmadan Bellek Dağıtma

C programlama dili , belleği serbest bırakmak için bir GC kullanmaz. Bu nedenle, C programcılarının belleği manuel olarak ayırması ve yeniden ayırması gerekir. C, derleme zamanında çalışma zamanında ne kadar bellek kullanacağınızı bilmediğiniz durumlar için dinamik bellek tahsisine izin verir.

Standart kitaplık (stdlib.h), C’nin dinamik bellek ayırmayı yönetmek için kullandığı işlevleri içerir. Bu işlevler şunları içerir:

malloc(): belirli bir bellek boyutunu tahsis eder ve bu belleğe bir işaretçi döndürür. İşletim sistemi bellek havuzunda yeterli bellek yoksa null değerini döndürür.

free(): belirli bir bellek bloğunu serbest bırakır ve onu işletim sistemi bellek havuzuna geri döndürür.

C Programı Örneği

#include <stdio.h>n#include <stdlib.h>n nint main()n{n int *ptr; // declare pointern int j; // declare countern n // allocate space for 200 integersn ptr = (int *) malloc(200 * sizeof(int));n n // insert integer values into the memory allocatedn // and print each value to the consolen for (j = 0; j < 200; j++)n {n ptr[j] = j;n printf(“%dt”,ptr[j]);n }n n // deallocate the previously allocated memoryn free(ptr);n return 0;n}

Yukarıdaki kod, malloc() işlevini kullanarak 200 tamsayı değeri depolamak için bellek ayırır. Bu bellek konumuna erişmek için bir işaretçi kullanır ve içinde 200 tamsayı değeri depolar. İşaretçi ayrıca bellek konumunda saklanan verileri konsola yazdırır. Son olarak program, free() işlevini kullanarak önceden ayrılmış belleği serbest bırakır .

Bir Çöp Toplayıcı ile Belleği Serbest Bırakma

Birçok popüler programlama dili, bellek yönetimi için bir GC kullanır. Bu, bu dilleri kullanan programcıların hayatını çok daha kolaylaştırır. C# ve Java, GC kullanan iki programlama dilidir.

C# GC

C# programlama dilinde , bir GC , bellek adreslerinin tahsisini ve yeniden tahsisini yönetir. Bu nedenle, bir C# programcısının amacını tamamladıktan sonra bir nesneyi yeniden konumlandırma konusunda endişelenmesine gerek yoktur.

C# GC, her yeni işlem (veya program) için yönetilen yığın adı verilen bir bellek havuzunu başlatır. Belleği ayırmak için VirtualAlloc() işlevini ve belleği serbest bırakmak için VirtualFree() işlevini çağırır. En iyi yanı, tüm bunların, programcı olarak sizden hiçbir çaba gerektirmeden arka planda gerçekleşmesidir.

C# GC, belleğin ne zaman yeniden tahsis edileceğine karar vermek için kullandığı bir en iyi duruma getirme motoruna sahiptir. Optimize etme motoru, hangi nesnelerin artık kullanılmadığını belirlemek için uygulama kökünü inceler. Bunu, uygulamanın kökünden bağlı nesnelere uzanan bir grafik oluşturarak yapar. Bu kök, statik alanlar, yerel değişkenler vb. içerir. Uygulama köküne bağlı olmayan herhangi bir nesne çöptür.

GC optimizasyon motoru, yalnızca kendi başına bellek toplamaz. İlk önce yeni bir bellek ayırma isteği olmalıdır. Sistemde düşük miktarda kullanılabilir bellek varsa, GC optimizasyon motoru devreye girecektir.

Java GC’si

Java’da, bir GC ayrıca bellek adreslerinin tahsisini ve yeniden tahsisini de yönetir. Ancak, Java şu anda dört farklı türde desteklenen çöp toplayıcıya sahiptir:

  • Önce Çöp (G1)
  • Seri
  • Paralel
  • Z Çöp Toplayıcı (ZGC)

G1 çöp toplayıcı, Java Development Kit (JDK) 9’un piyasaya sürülmesinden bu yana Java’nın varsayılan GC’sidir. Java, nesnelerdeki verileri düzenler ve bu nesneleri sabit boyutlu bir yığında depolar. G1 çöp toplayıcı, yığını eşit boyutlu yığın bölgelerine böler. Daha sonra bu yığın bölgelerini iki bölüme ayırır; genç ve yaşlı nesiller.

Her yeni nesne oluşturduğunuzda, bu nesne için alan tahsisi genç nesilde gerçekleşir. G1 çöp toplayıcı, bir yaşlanma sürecini kullanarak genç bölgelerdeki nesneleri eski bölgelere kopyalar. Ayrıca eski bölgede bulunan nesneleri daha eski bir bölgeye kopyalar.

G1 çöp toplayıcı daha sonra genç nesilde bellek ayırmasının çoğunu gerçekleştirir ve ara sıra eski nesil bölümüne girer.

Çöp Toplayıcıya Sahip Olmanın Faydaları Nelerdir?

Bir çöp toplayıcıya sahip olmanın yararı, kodunuzu yazarken bellek yönetimi hakkında düşünmenizi engellemesidir. Bu, uygulamanızın diğer önemli yönlerine odaklanmanız için size zaman verir. Bununla birlikte, diğer bazı faydaların altını çizmeye değer.

Kullanılmayan nesneleri geri almak ve belleği boşaltmak, daha temiz uygulama yürütme sağlar. Programınız belleği mümkün olan en kısa sürede boşaltırsa, daha küçük bir bellek alanına sahip olur ve daha verimli çalışabilir.

Çöp toplama, sızıntılar ve işaretçi hataları gibi bellek yönetimiyle ilgili hataları azaltır. Bunun nedeni, sürecin artık programcıya ve onların doğru kod yazma becerilerine bağlı olmamasıdır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir