Düşük duraklamalı GC'nin arkasındaki algoritmalar nelerdir?


12

Bazı diller, exemple java için düşük bir duraklama GC'si getirdi.

Bu GC işin çoğunu tüm dünyayı duraklatmadan yapabilir. Bu açıkçası oldukça zor bir sorundur, çünkü iş parçacığı onu değiştirirken belleği analiz etmeyi gerektirir, bu da işlemin başlangıcında kullanılabilen ve artık bittiğinde değil veya garbaj gibi görünen verilerle sonuçlanan verilerle sonuçlanır. referans bellekte taşındı ve GC'nin baktığı yerde hiç görünmedi.

Temel olarak, bunun arkasındaki algoritma (lar) nedir?

Bu makale gerçekten teknik olduğu için araştırma yazıları veya gerçekten teknik makalenin bağlantısı geçerli bir cevap olarak değerlendirilecektir.

Yanıtlar:


16

Temel olarak, bunun arkasındaki algoritma (lar) nedir?

Temel olarak "sadece" ayrı bir iş parçacığında aynı anda çalışan bir mark ve süpürme algoritmasıdır .

Bu konuda araştırma makalelerine gelince:


5

anladığım kadarıyla, Java G1 çöp toplayıcı tüm dünyayı duraklatmak için yığın bölgeleri kullanıyor . Gördüğüm gibi, bölgelerden biri temizleme işlemi yapan GC tarafından kilitlenirken, bellek ayırma işlemi başka bir bölgede yapılır.

İşte Jeremy Manson'dan bir açıklama :

İlke basittir: toplayıcı, yığını sabit boyutlu bölgelere ayırır ve bu bölgelerdeki canlı verileri izler. Bölgenin içine ve dışına bir dizi işaretçi ("hatırlanan küme") tutar. Bir GC gerekli görüldüğünde, önce daha az canlı verisi olan bölgeleri toplar (dolayısıyla "önce çöp"). Genellikle bu, tüm bir bölgeyi bir adımda toplamak anlamına gelebilir: bir bölgeye işaretçi sayısı sıfırsa, o bölgenin işaretini veya süpürmesini gerekmez ...


5

IBM'in gerçek zamanlı JVM'si, Metronom adı verilen ve GC aktivitesini ayrı bir kuantuya ayıran ve bunları uygulama işlemeye ekleyen bir çöp toplayıcı kullanır . Temel olarak periyodik (ve deterministik olmayan) dünyayı durdurma GC duraklamaları yerine, GC paralel olarak yapılırken uygulama biraz daha yavaş çalışır.

Dinamik birleştirme yapan ve gerçek zamanlı gereksinimleri karşılayan başka bir GC var, ancak bulabildiğim tek referans burada (ACM üyeliği gerekli).

İlginç bir eşzamanlı gerçek zamanlı çöp toplayıcı durmaksızın . Geleneksel işaretleme ve süpürme yaklaşımını kullanır, ancak çok işlemcili sistemlerde kullanılmak üzere tasarlanmıştır ve kilitsiz eşzamanlı çoklu iş parçacığını destekler.


Güzel ! Çok kötü ACM'ye erişimim yok, bu makale gerçekten ilginç görünüyor.
deadalnix

2

Çalışmasının nedeni Java'da yalnızca GC'nin GC referansları içerebilecek belleği serbest bırakabilmesidir. Bu, nesneleri ayrı bir iş parçacığında güvenli bir şekilde okuyabildiğiniz sürece, programı yığındaki referansları gözlemlemek için yalnızca duraklatmanız gerektiği anlamına gelir.

Mutasyon için, GC'yi değişiklik hakkında bilgilendirmek için bir çeşit yazma-kopyalama uyguladıklarını öneririm.


Bu referans herhangi bir iş parçacığı tarafından herhangi bir zamanda güncellenebildiği sürece bu yeterli değildir.
deadalnix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.