CLR 4.5 da 'Garbage Collection' ile ilgili yenilikler

 Merhaba Arkadaşlar,

Yeni haberlere göre, CLR 4.5 ile birlikte, ‘Garbage Collection’ yapısında özellikle büyük ölçekte uygulamalarda performans artırımını temel alan değişiklikler mevcut.

Bu değişiklikler özetle aşağıdaki gibi.

#1 <gcConcurrent> konfigürasyon opsiyonu artık ‘Server’ modunda da geçerli olacak. CLR 4.0 ve öncesinde bildiğiniz üzere ‘Workstation’ modunda ‘Concurrent GC’ opsiyonu sunularak, ‘Garbage Collection’ işleminin arka planda gerçekleşmesi sağlanabiliyordu. ‘Server’ modunda böyle bir opsiyon olmadığı için ‘GC’ esnasında ise diğer tüm thread’ler suspend ediliyor ve dolayısı ile bu uygulamada kısa süreli gecikmelere sebebiyet veriyordu.

CLR 4.5 ‘da ise artık ‘background server garbage collection’ geliyor. Bu sayede’Workstation’ yada ‘Server’ modu farketmeksizin tüm uygulamalar ‘GC’ işlemini diğer çalışan thread’leri durdurmadan arka planda yapabiliyor olacak.

#2 Önceki CLR versiyonunda gereksiz ‘Garbage Collection’ yapılmasına neden olan ‘imbalanced heap’ sorunu 4.5 versiyonu ile birlikte çözülüyor olacak. CLR 4.0 ve önceki versiyonlarda SOH (Small Object Heap) kullanımı dengelenmekte iken LOH (Large Object Heap) kullanımı dengelenmemekte idi. Şöyleki; 'server' modda her bir işlemciye bir heap düşmekte ve herhangi bir nedenden işlemcilerden bir tanesinin LOH kullanımı diğerlerine göre fazla olabiliyor (‘unbalanced’) ve bu sebepten gereksiz yere ‘Garbage Collection’ tetikleniyordu.

#3 CLR 4.5 da NUMA Awareness geliyor. NUMA mimarisinin (non-unified memory access) özelliği bildiğiniz üzere farklı NUMA nod’ları arasında ‘memory’ erişim zamanlarının farklılık göstermesi. Windows 7 ve 2008 R2 işletim sistemleri ile birlikte Windows artık 64 çekirdekten daha fazlasını, processor grupları tanımlayarak desteklemekte. CLR 4.5 da artık <GCCpuGroup> konfigürasyon elementi ile GC ‘nin NUMA desteğini algılayıp ona göre çalışmasını sağlayabiliyoruz.

#4 CLR 4.5 da ‘SustainedLowLatency’ modu ile ‘Garbage Collection’ dan kaynaklanan gecikmelerin önüne geçilmeye çalışılıyor. Bu modda ‘generation 0’ , ‘generation 1’ ve ‘arkaplan generation 2’ ‘Collection’ ları devamlı olarak çalışıyor. Temel amaç daha yüksek memory kullanarak daha az gecikme yaşıyor olmak dolayısı ile ‘Memory’ kaynakları yüksek olan Server’lar üzerinde bunun kullanılmasında fayda var.

#5 CLR 4.5 da ‘LOH’ fragmantasyonu azaltılıyor. Şöyleki önceki versiyonlarda, GC algoritması LOH üzerinde boş bir blok ararken, ‘reject’ ettiği boşlukları tekrar değerlendirmemekte idi. Yeni versiyonda artık ‘reject’ edilen memory blokları her seferinde değerlendirilerek ‘fragmantasyon’ azaltılıyor olacak.

#6 <gcAllowVeryLargeObjects> konfigürasyon elementi ile 2 GB’dan büyük .net objeleri yaratılabiliyor olacak. Bu özellikle devasa ‘datatable’ kullanımlarının önünü açıyor.

 Daha detaylı bilgi için bu blog’u inceleyebilirsiniz.

İyi çalışmalar,

Mert Öztürk