Aracılığıyla paylaş


Otomatik Bellek Yönetimi

Otomatik bellek yönetimi, Ortak Dil Çalışma Zamanı'nın Yönetilen Yürütme sırasında sağladığı hizmetlerden biridir. Ortak Dil Çalışma Zamanı'nın çöp toplayıcısı, bir uygulama için bellek ayırmayı ve serbest bırakma işlemini yönetir. Geliştiriciler için bu, yönetilen uygulamalar geliştirirken bellek yönetimi görevlerini gerçekleştirmek için kod yazmanız gerekmediği anlamına gelir. Otomatik bellek yönetimi, bir nesneyi boşaltmayı unutmak ve bellek sızıntısına neden olmak veya zaten serbest bırakılmış bir nesnenin belleğine erişmeye çalışmak gibi yaygın sorunları ortadan kaldırabilir. Bu bölümde, çöp toplayıcının belleği nasıl ayırdığı ve serbest bıraktığı açıklanmaktadır.

Bellek Ayırma

Yeni bir işlem başlatırken, çalışma zamanı işlem için bitişik bir adres alanı bölgesi ayırır. Bu ayrılmış adres alanı yönetilen yığın olarak adlandırılır. Yönetilen yığın, yığındaki sonraki nesnenin ayrılacağı adrese yönelik bir işaretçi tutar. Başlangıçta, bu işaretçi yönetilen yığının temel adresine ayarlanır. Tüm başvuru türleri yönetilen yığında tahsis edilir. Bir uygulama ilk başvuru türünü oluşturduğunda, yönetilen yığının temel adresinde tür için bellek ayrılır. Uygulama bir sonraki nesneyi oluşturduğunda, atık toplayıcı ilk nesnenin hemen ardından adres alanında bunun için bellek ayırır. Adres alanı kullanılabilir olduğu sürece, çöp toplayıcı yeni nesneler için bu şekilde alan ayırmaya devam eder.

Yönetilen yığından bellek ayırma, yönetilmeyen bellek ayırmadan daha hızlıdır. Çalışma zamanı, işaretçiye bir değer ekleyerek nesne için bellek ayırdığından, bu işlem yığından bellek ayırmak kadar neredeyse hızlıdır. Ayrıca, ardışık olarak ayrılan yeni nesneler yönetilen yığında bitişik olarak depolandığından, bir uygulama nesnelere çok hızlı bir şekilde erişebilir.

Belleği Serbest Bırakma

Atık toplayıcının iyileştirme altyapısı, yapılan ayırmalara göre bir toplama gerçekleştirmek için en iyi zamanı belirler. Çöp toplayıcı bir toplama gerçekleştirdiğinde, artık uygulama tarafından kullanılmayan nesneler için belleği serbest bırakır. Uygulamanın köklerini inceleyerek hangi nesnelerin artık kullanılmadığını belirler. Her uygulamanın bir kök kümesi vardır. Her kök, yönetilen yığındaki bir nesneye başvurur veya null olarak ayarlanır. Uygulamanın kökleri statik alanları, iş parçacığı yığınındaki yerel değişkenleri ve parametreleri ve CPU yazmaçlarını içerir. Çöp toplayıcı, tam zamanında (JIT) derleyicisinin ve çalışma zamanının koruduğu etkin kökler listesine erişebilir. Bu listeyi kullanarak uygulamanın köklerini inceler ve bu süreçte köklerden ulaşılabilen tüm nesneleri içeren bir grafik oluşturur.

Grafikte olmayan nesnelere uygulamanın köklerinden ulaşılamıyor. Çöp toplayıcı, ulaşılamayan nesneleri çöp olarak kabul eder ve bunlar için ayrılan belleği serbest bırakır. Toplama sırasında çöp toplayıcı, ulaşılamayan nesnelerin kapladığı adres alanı bloklarını arayarak yönetilen yığını inceler. Ulaşılamayan her nesneyi keşfederken, erişilebilen nesneleri bellekte sıkıştırmak için bir bellek kopyalama işlevi kullanır ve ulaşılamayan nesnelere ayrılan adres alanı bloklarını serbest bırakır. Erişilebilir nesneler için bellek sıkıştırıldıktan sonra, çöp toplayıcı uygulamanın köklerinin yeni konumlardaki nesnelere doğru işaret etmesi için gerekli işaretçi düzeltmelerini gerçekleştirir. Ayrıca yönetilen yığının işaretçisini son erişilebilen nesnenin arkasına yerleştirir. Belleğin yalnızca bir koleksiyonun çok sayıda erişilemez nesne bulması durumunda sıkıştırıldığını unutmayın. Yönetilen yığındaki tüm nesneler bir koleksiyonda hayatta kalırsa bellek sıkıştırmaya gerek yoktur.

Performansı geliştirmek için çalışma zamanı, büyük nesneler için ayrı bir yığında bellek ayırır. Çöp toplayıcı, büyük nesneler için belleği otomatik olarak serbest bırakır. Ancak, bellekte büyük nesnelerin taşınmasını önlemek için bu bellek sıkıştırılmaz.

Nesiller ve Performans

Çöp toplayıcının performansını iyileştirmek için yönetilen yığın üç nesile ayrılır: 0, 1 ve 2. Çalışma zamanının çöp toplama algoritması, bilgisayar yazılımı sektörünün çöp toplama düzenleriyle denemeler yaparak doğru olduğunu keşfettiği çeşitli genelleştirmeleri temel alır. İlk olarak, yönetilen yığının bir bölümü için belleği sıkıştırmak, yönetilen yığının tamamına göre daha hızlıdır. İkinci olarak, daha yeni nesnelerin ömrü daha kısa ve eski nesnelerin ömrü daha uzun olacaktır. Son olarak, daha yeni nesneler birbiriyle ilişkili olma ve uygulama tarafından aynı zamanda erişilme eğilimindedir.

Çalışma zamanının çöp toplayıcısı yeni nesneleri 0. nesilde depolar. Uygulama ömründe erken oluşturulan ve koleksiyonlarda hayatta kalan nesneler yükseltilir ve 1. ve 2. nesillerde depolanır. Nesne yükseltme işlemi bu konunun ilerleyen bölümlerinde açıklanmıştır. Yönetilen yığının bir bölümünü yığının tamamına göre sıkıştırmak daha hızlı olduğundan, bu düzen atık toplayıcının her toplama işlemi gerçekleştirişinde yönetilen yığının tamamının belleğini serbest bırakmak yerine belleği belirli bir nesilde serbest bırakmasına olanak tanır.

Gerçekte, 0. nesil dolduğunda çöp toplayıcı bir toplama gerçekleştirir. Bir uygulama 0. nesil dolduğunda yeni bir nesne oluşturmaya çalışırsa, atık toplayıcı nesne için ayrılacak 0. nesilde adres alanı kalmadığını bulur. Atık toplayıcı, nesne için 0. nesildeki adres alanını boşaltma girişiminde bir toplama gerçekleştirir. Çöp toplayıcı, yönetilen yığındaki tüm nesneler yerine 0. nesildeki nesneleri inceleyerek başlar. Bu en verimli yaklaşımdır, çünkü yeni nesnelerin ömrü kısadır ve 0. nesildeki nesnelerin çoğunun bir koleksiyon gerçekleştirildiğinde uygulama tarafından artık kullanılmayacağı beklenir. Ayrıca, tek başına 0. nesil bir koleksiyon genellikle uygulamanın yeni nesneler oluşturmaya devam etmesi için yeterli belleği geri alır.

Atık toplayıcı 0. nesil bir toplama işlemi gerçekleştirdikten sonra, bu konunun önceki bölümlerinde yer alan Belleği Serbest Bırakma bölümünde açıklandığı gibi erişilebilir nesnelerin belleğini sıkıştırıyor . ** Çöp toplayıcı daha sonra bu nesneleri terfi ettirir ve yönetilen yığının 1. nesil olan bu bölümünü dikkate alır. Koleksiyonlardan kurtulan nesnelerin kullanım ömrü daha uzun olduğundan, bunları daha yüksek bir nesle yükseltmek mantıklıdır. Sonuç olarak, atık toplayıcının nesil 1 ve 2'deki nesneleri 0. nesil bir toplama işlemi gerçekleştirdiği her seferinde yeniden gözden geçirmesi gerekmez.

Atık toplayıcı ilk nesil 0 toplamasını gerçekleştirdikten ve erişilebilir nesneleri 1. nesile yükselttikten sonra, yönetilen yığınında nesil 0'ın geri kalanını dikkate alır. 0. nesil dolana kadar 0. nesildeki yeni nesneler için bellek ayırmaya devam eder ve başka bir koleksiyon gerçekleştirmek gerekir. Bu noktada, çöp toplayıcının iyileştirme altyapısı, eski nesillerdeki nesneleri incelemenin gerekli olup olmadığını belirler. Örneğin, 0. nesil bir koleksiyon, uygulamanın yeni bir nesne oluşturma girişimini başarıyla tamamlaması için yeterli belleği geri kazanmazsa, atık toplayıcı 1. nesil ve ardından 2. nesilden oluşan bir koleksiyon gerçekleştirebilir. Bu yeterli belleği geri kazanmazsa, çöp toplayıcı 2, 1 ve 0 nesillerinden oluşan bir toplama gerçekleştirebilir. Her toplama işleminden sonra, atık toplayıcı 0. nesildeki erişilebilir nesneleri sıkıştırarak nesil 1'e yükseltiyor. 1. nesildeki koleksiyonlarda hayatta kalan nesneler 2. nesil olarak yükseltilir. Atık toplayıcı yalnızca üç nesli desteklediğinden, 2. nesildeki bir toplama işleminden sonra hayatta kalan nesneler, gelecek bir koleksiyonda ulaşılamayacakları belirlenene kadar 2. nesilde kalır.

Yönetilmeyen Kaynaklar için Bellek Serbest Bırakma

Uygulamanızın oluşturduğu nesnelerin çoğu için, gerekli bellek yönetimi görevlerini otomatik olarak gerçekleştirmek için çöp toplayıcıya güvenebilirsiniz. Ancak, yönetilmeyen kaynaklar açık temizleme gerektirir. En yaygın yönetilmeyen kaynak türü, dosya tanıtıcısı, pencere tutamacı veya ağ bağlantısı gibi bir işletim sistemi kaynağını sarmalayan bir nesnedir. Atık toplayıcı, yönetilmeyen bir kaynağı kapsülleyen yönetilen bir nesnenin ömrünü izleyebilse de, kaynağın nasıl temizlendiğinin belirli bir bilgisine sahip değildir. Yönetilmeyen bir kaynağı kapsülleyen bir nesne oluşturduğunuzda, genel Dispose yönteminde yönetilmeyen kaynağı temizlemek için gerekli kodu sağlamanız önerilir. Dispose yöntemi sağlayarak, nesnenizin kullanıcılarının nesneyle işi bittiğinde açıkça belleğini boşaltmasını sağlarsınız. Yönetilmeyen bir kaynağı kapsülleyen bir nesne kullandığınızda, Dispose'ı bilmeniz ve gerektiği gibi çağırmanız gerekir. Yönetilmeyen kaynakları temizleme hakkında daha fazla bilgi ve Dispose'ı uygulamaya yönelik bir tasarım deseni örneği için bkz. Çöp Toplama.

Ayrıca bakınız