Bir çöp toplama sadece referans verilmeyen nesnelerden kurtulmakla kalmaz, aynı zamanda yığını da sıkıştırır . Bu çok önemli bir optimizasyon. Sadece bellek kullanımını daha verimli hale getirmekle kalmaz (kullanılmayan delikler yok), CPU önbelleğini çok daha verimli hale getirir. Önbellek, modern işlemciler için gerçekten çok önemli, bellek veri yolundan daha hızlı, kolay bir büyüklük sıralaması.
Sıkıştırma, baytları kopyalayarak yapılır. Ancak bu zaman alır. Nesne ne kadar büyükse, onu kopyalama maliyetinin olası CPU önbellek kullanım iyileştirmelerinden daha ağır basma olasılığı o kadar yüksektir.
Bu yüzden başa baş noktasını belirlemek için bir dizi kıyaslama yaptılar. Ve kopyalamanın artık performansı iyileştirmediği kesme noktası olarak 85.000 bayta ulaştı. İkili diziler için özel bir istisna ile, dizi 1000'den fazla öğe içerdiğinde bunlar 'büyük' olarak kabul edilir. Bu, 32 bit kod için başka bir optimizasyondur, büyük nesne yığın ayırıcısı, yalnızca 4'e hizalı ayıran normal nesil ayırıcıdan farklı olarak, 8'e hizalanmış adreslerde bellek ayırma özelliğine sahiptir. Bu hizalama, çift için büyük bir olaydır yanlış hizalanmış bir çift okumak veya yazmak çok pahalıdır. İşin garibi, seyrek Microsoft bilgisi asla uzun dizilerden bahsetmiyor, bunun ne olduğundan emin değil.
Fwiw, büyük nesne yığınının sıkıştırılmaması konusunda çok sayıda programcı endişesi var. Bu, mevcut tüm adres alanının yarısından fazlasını kullanan programlar yazdıklarında her zaman tetiklenir. Ardından, kullanılmayan çok sayıda sanal bellek olmasına rağmen programın neden bombalandığını öğrenmek için bellek profili oluşturucu gibi bir araç kullanılır. Böyle bir araç, daha önce büyük bir nesnenin yaşadığı ancak çöpün toplandığı kullanılmayan bellek parçalarını, LOH'daki delikleri gösterir. Bu, LOH'nin kaçınılmaz fiyatıdır, delik yalnızca boyutu eşit veya daha küçük olan bir nesne için bir tahsis tarafından yeniden kullanılabilir. Gerçek sorun, bir programın herhangi bir zamanda tüm sanal belleği kullanmasına izin verilmesi gerektiğini varsaymaktır .
Aksi halde kodu 64 bit işletim sisteminde çalıştırarak tamamen ortadan kalkan bir sorun. 64 bitlik bir işlem, 8 terabaytlık sanal bellek adres alanına sahiptir, 32 bitlik bir işlemden 3 büyüklük sırası daha fazladır. Sadece deliklerden kaçamazsın.
Uzun lafın kısası, LOH kodun daha verimli çalışmasını sağlar. Mevcut sanal bellek adres alanını kullanma pahasına daha az verimli.
UPDATE, .NET 4.5.1 artık LOH, GCSettings.LargeObjectHeapCompactionMode özelliğini sıkıştırmayı destekliyor . Sonuçlarına dikkat edin lütfen.