· kaynak Hacker News – Front Page (native)
jemalloc 5.4.0, düzeltme, yeniden düzenleme ve taşınabilirlik çalışması içeren 160'tan fazla commit ile geliyor
jemalloc ayırıcısının 5.4.0 sürümü, hata düzeltmeleri, iç yapısal yeniden düzenleme ve taşınabilirlik çalışmalarına ek olarak sabitlenmiş bellek (pinned memory) takibi ile uyarlanabilir bir thread-cache politikası içeriyor.
Ne oldu
jemalloc 5.4.0 yayınlandı ve bu, büyük ölçekli bir bakım sürümü. GitHub'da yayımlanan sürüm notlarına göre güncelleme, doğrudan teknik borca odaklanan 160'tan fazla commit'i kapsıyor: iç yapısal yeniden düzenleme, hata düzeltmeleri, daha geniş test kapsamı ve eski seçeneklerin emekliye ayrılması, ayrıca yukarı akış (upstream) sorun bildirimlerine yanıt olarak gönderilen taşınabilirlik düzeltmeleri. Haber, 18 Eylül 2026'da Hacker News'in ana sayfasına ulaştı.
Yeni özellikler
Öne çıkan eklenen özellik, sabitlenmiş bellek (pinned memory) desteği. Yeni EXTENT_ALLOC_FLAG_PINNED bayrağı, özel extent-allocation hook'larının geri kazanılamayan eşlemeleri işaretlemesine olanak tanıyor — örnek olarak HugeTLB sayfaları veriliyor — böylece ayırıcı bunları decay ve purge mekanizmasından geçirmek yerine tercihli olarak yeniden kullanıyor. Bunun yanında stats.pinned dahil olmak üzere arena ve extent başına sayaçlar ile yeni yol için mutex istatistikleri içeren bir dizi mallctl arayüzü, bu kullanımı gözlemlenebilir kılıyor.
Diğer yandan, CPU başına arena seçimi artık bir thread belirli bir arena'ya sabitlendikten sonra thread.arena üzerinden yeniden başlatılabiliyor; malloc istatistik çıktısının insan tarafından okunabilir ve JSON biçimleri birbirine daha yakın hale getirilmiş durumda; ve runtime'daki experimental_infallible_new seçeneği, derleme zamanında kullanılan --enable-cxx-infallible-new anahtarıyla değiştirildi. Notlara göre bu, derleyicinin move constructor'lar dahil olmak üzere daha ileri düzeyde optimize etmesini sağlıyor ve new(std::nothrow) sözleşmesini düzeltiyor.
Kırıcı değişiklik: uyarlanabilir thread cache
Tek uyumsuz değişiklik thread cache ile ilgili. jemalloc artık çöp toplama (garbage collection) olayları arasında gözlemlenen talebe göre kutu (bin) başına doldurma ve tutma hedeflerini uyarlıyor ve önceki sabit yeniden doldurma ile boşaltma politikasını rafa kaldırıyor. Bu geçiş kapsamında yedi eski, deneysel olmayan kontrol kaldırıldı: lg_tcache_nslots_mul, tcache_nslots_small_min, tcache_nslots_small_max, tcache_nslots_large, tcache_gc_delay_bytes, lg_tcache_flush_small_div ve lg_tcache_flush_large_div. Eşleşen malloc_conf ayarları artık uyarı vermeden yok sayılıyor, ilgili opt.* mallctl'leri ENOENT döndürüyor ve tcache_ncached_max çalışmaya devam ediyor. Eski ayarları içeren bir malloc_conf dizisi dağıtan herkes, yükseltmeden önce bunu denetlemeli, çünkü başarısızlık sessiz oluyor.
Önemli düzeltmeler
Düzeltme listesi, katı tüketiciler için önemli olan doğruluk köşelerine dokunuyor. free, free_sized ve free_aligned_sized artık errno'yu koruyor; process_madvise tabanlı sayfa temizlemesi de öyle — bu, POSIX beklentileriyle yazılmış kodun çoğunlukla kütüphane çağrılarının errno'yu ezmediğini varsapmasından dolayı önemli. free_sized ve free_aligned_sized artık NULL kabul ediyor ve bu, C23 ile uyumlu. Boyut sınıfı (size-class) sayısal taşma kontrolleri düzeltildi, arena_reset sırasında oluşabilecek bir kilitlenme (deadlock) çözüldü ve malloc_stats_print çıktısında yinelenen opt.stats_print alanları artık görünmüyor.
Thread'e özgü veri (TSD) yaşam döngüsü hataları iki cephede giderildi: thread-cache kutuları, cache etkin olarak işaretlenmeden önce başlatılıyor ve bu, yeniden giriş yapan (reentrant) önyükleme tahsislerinin başlatılmamış duruma dokunmasını engelliyor; ayrıca generic-TSD platformlarında thread kapanışından sonraki gecikmiş serbest bırakmalarda TSD artık yeniden oluşturulmuyor. THP sysfs dosyası artık O_CLOEXEC ile açılıyor ve böylece exec üzerinden sızmıyor; SAN katmanındaki profil örnekleme ve koruma sayfaları (guard page) etkileşimindeki bir hata onarıldı.
Yapısal bir dönüşüm
Sürümün büyük kısmı içeride yeniden yapılandırmadan oluşuyor. jemalloc.c içindeki ön uç parçalara ayrıldı; arena yönetimi, başlatma, fork orkestrasyonu ve tahsis dağıtımı kendi modüllerine çıkarılırken, tcache ve arena sahipliği çözüldü ve döngüsel başlık bağımlılıkları ortadan kaldırıldı. Kontrol düzlemi kodu alt sistemlere göre yeniden düzenlendi, istatistik toplama ayrı toplama ve yayımlama aşamalarına ve tanımlayıcı tablolarla yönetilen bir yapıya dönüştürüldü, PAI vtable katmanı doğrudan PAC ve HPA çağrıları lehine silindi. Bir base-block büyüme sezgisi artık sınırlanıyor ve böylece nadir görülen bir yarış durumu sürecin sanal adres alanını tükitemiyor; background-thread yaşam döngüsü mantığı kendi modülüne taşındı ve gelecekteki portlar için en önemli yenilik olarak, yeni bir OS soyutlama katmanı platforma bağımlı dosya ve süreç G/Ç'sini, zamanı, senkronizasyonu, CPU'yu, sanal belleği, atfork'u, hata işlemeyi ve ilgili işlemleri ayırıcı çekirdeğinden yalıtıyor.
Taşınabilirlik çalışmaları
Taşınabilirlik cephesinde sürüm, macOS üzerinde malloc_getcpu'yu mevcut CPU numarasını doğru okuyacak şekilde düzeltiyor; background-thread uykularını CLOCK_MONOTONIC'e geçiriyor ve monotonik condvar desteğini configure zamanında algılıyor — bu, sistem saati geriye doğru atladığında duraksamaları önlüyor —; MinGW'deki thread çıkışı TSD temizliğini onarıyor ve GCC 16 ile macOS derleme uyarılarını susturuyor. arena_s artık C99 esnek dizi üyesi (flexible array member) kullanıyor, rdtscp algılaması --with-lg-vaddr ile yeniden çalışıyor, libstdc++'a özgü std::__throw_bad_alloc çağrısı standart C++ ile değiştirildi ve PID-namespace sembolik bağ ayrıştırması artık glibc'nin strtok ve atol işlevlerine bağlı değil; tanımlayıcılar bunun yerine uint64_t olarak döndürülüyor.
Neden önemli
jemalloc, muazzam miktarda üretim yazılımının altında yer alıyor; bu yüzden sessiz doğruluk düzeltmeleri — errno koruması, arena_reset kilitlenmesi, TSD yaşam döngüsü uç durumları — commit sayısının çok ötesinde bir değer taşıyor. Thread-cache değişikliği pratikteki yükseltme riski: eski seçenekler gürültülü değil, sessizce kayboluyor ve bu da dağıtımdan önce gömülü yapılandırmayı kontrol etmeyi akla getiriyor. Uzun vadede ise OS soyutlama katmanı ve modülerleşen ön uç, jemalloc'u yeni platformlara taşıma maliyetini düşürüyor ve gelecekteki değişikliklerin kabul edilmesini kolaylaştırmalı; yeni sabitlenmiş bellek (pinned memory) kontrolleri de HugeTLB destekli iş yüklerini yönetenlere daha önce sahip olmadıkları görünürlük ve kontrolü sunuyor.
- #memory-management
- #systems-programming
- #allocator
- #open-source
- #c