Çöp toplayıcı (GC) bir bellek yöneticisidir. Birçok programlama dilinde yerleşik bir GC vardır. 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.
Bir 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, her programlama dilinde olmasını beklediğiniz kadar önemli bir özellik olarak düşünebilirsiniz. Ne yazık ki, bu durum böyle değil; C gibi popüler bir dil bile GC'den yoksun olabilir.
Bellek Tahsisi Nasıl Çalışır?
Herhangi bir programlama dilinde bir program çalıştırdığınızda, işletim sisteminiz bir bellekteki veri yığını o program için. Bu program, yürütmeyi tamamlayana kadar bu veri yığınının sahibidir ve bu yığını işgal eder. Programınızın mevcut olandan daha fazla belleğe ihtiyacı varsa, işletim sisteminin bellek yığınından dinamik olarak daha fazla bellek ayırabilir.
Programlamada, bir değişken bir bellek konumunu temsil eder. Bu nedenle, 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 atanana kadar başlatılmamış olarak kalacaktır ve bazı çöp değerler içerebilir.
Bir programlama dili, bir değişkeni başlatmadan tanımlamanıza izin veriyorsa, o zaman dinamik bir değişkendir. Bu, değişkene atadığınız değerin zamanla değişebileceği anlamına gelir. Ancak, değişkenin bellek konumu, siz onu serbest bırakana kadar aynı kalacaktır.
Belleğin Serbest Bırakılması Nasıl Çalışır?
Bellek ayırma, tüm programlama dilleri için benzer bir işlemdir. Ancak karşılık gelen bellek ayırma yöntemi farklılık gösterme eğilimindedir. İki tür bellek ayırma yöntemi vardır; manuel ve otomatik. Bir GC otomatik ayırma yapar.
Çöp Toplayıcı Olmadan Belleğin Serbest Bırakılması
bu C programlama dili bellek ayırma için bir GC kullanmaz. Bu nedenle, C programcıları belleği manuel olarak ayırmalı ve serbest bırakmalıdır. C, derleme zamanında, çalışma zamanında ne kadar bellek kullanacağınızı bilmediğiniz zamanlar 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 boyutu 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 döndürür.
C Programı Örneği
#Dahil etmek
#Dahil etmekintana()
{
int *ptr; // işaretçi bildir
int j; // sayacı bildir// 200 tam sayı için yer ayır
ptr = (int *) malloc(200 * boyutu(int));// ayrılan belleğe tamsayı değerleri gir
// ve her değeri konsola yazdır
için (j = 0; j < 200; j++)
{
ptr[j] = j;
baskı("%d\t",ptr[j]);
}
// önceden ayrılmış belleği serbest bırak
Bedava(ptr);
dönüş0;
}
Yukarıdaki kod, aşağıdakileri kullanarak 200 tamsayı değerini depolamak için bellek ayırır. malloc() işlev. 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 depolanan verileri konsola yazdırır. Son olarak, program, daha önce tahsis edilen belleği, Bedava() işlev.
Çöp Toplayıcı ile Belleğin Serbest Bırakılması
Birkaç popüler programlama dili, bellek yönetimi için bir GC kullanır. Bu, bu dilleri kullanan programcıların hayatını çok daha kolay hale getirir. C# ve Java, GC kullanan iki programlama dilidir.
C# GC'si
İçinde C# programlama dili, bir GC, bellek adreslerinin tahsisini ve serbest bırakılmasını yönetir. Bu nedenle, bir C# programcısının amacını tamamladıktan sonra bir nesneyi serbest bırakma konusunda endişelenmesine gerek yoktur.
C# GC, her yeni işlem (veya program) için yönetilen yığın adı verilen bir bellek havuzu başlatır. Şunu çağırır: VirtualAlloc() bellek ayırma işlevi ve SanalÜcretsiz() serbest bırakmak için işlev. En iyi yanı, tüm bunların arka planda, sizden, programcıdan hiçbir çaba gerektirmeden gerçekleşmesidir.
C# GC, belleğin ne zaman serbest bırakılacağına karar vermek için kullandığı bir optimizasyon motoruna sahiptir. Optimizasyon motoru, hangi nesnelerin artık kullanımda olmadığı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şkenleri 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. Önce yeni bir bellek ayırma isteği olmalıdır. Sistemde düşük miktarda kullanılabilir bellek varsa, GC optimizasyon motoru devreye girer.
Java GC'si
Java'da, bir GC ayrıca bellek adreslerinin tahsisini ve serbest bırakılmasını da 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 saklar. 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ı, yaşlandırma işlemini kullanarak genç bölgelerdeki nesneleri eski bölgelere kopyalar. Ayrıca, zaten eski bölgede bulunan nesneleri daha eski bir bölgeye kopyalar.
G1 çöp toplayıcı daha sonra bellek ayırma işleminin çoğunu genç nesilde gerçekleştirir ve zaman zaman eski nesil bölümüne girer.
Çöp Toplayıcı Olmanın Faydaları Nelerdir?
Bir çöp toplayıcıya sahip olmanın yararı, kodunuzu yazarken bellek yönetimi hakkında düşünmenizi engellemesidir. Bu size uygulamanızın diğer önemli yönlerine odaklanmanız için zaman verir. Bununla birlikte, diğer bazı faydaları vurgulamaya değer.
Kullanılmayan nesneleri geri almak ve belleği boşaltmak, uygulamanın daha temiz yürütülmesini sağlar. Programınız belleği mümkün olan en kısa sürede boşaltırsa, daha küçük bir bellek ayak izine 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 doğru kod yazma yeteneklerine bağlı olmamasıdır.