Özetle : Çöp toplayıcıları özyineleme kullanmaz. Sadece iki kümeyi (birleştirebilecek) izleyerek izlemeyi kontrol ederler. İzleme ve hücre işleme sırası, kümeleri temsil etmek için hatırı sayılır bir uygulama özgürlüğü sağlayan alakasızdır. Bu nedenle, bellek kullanımında aslında çok ucuz olan birçok çözüm vardır. Yığın hafızası bittiğinde GC tam olarak çağrıldığından bu önemlidir. Yeni sayfalar kolaylıkla ayrılabilir olarak şeyler, büyük sanal anılarla biraz farklıdır ve ennemy alanı eksikliği, ancak veri eksikliği değildir
mevkiinde .
Varsayın, çöp toplayıcıları izlemeyi düşünüyorsunuz , sorunuzun uygulanmadığı durumlarda referans sayımı yapmıyorsunuz.
Soru, bir kümeyi takip etmek için izlemenin bellek maliyetine odaklanıyor : hala izlenemeyen işaretçiler içeren erişilebilir bellek hücrelerinin grubu (izlenmemiş olanlar için). Bu
çöp toplama için sadece hafıza sorunun yarısı . GC, başka bir kümeyi de takip etmelidir: işlemin sonunda diğer hücrelerin geri kazanılması için erişilebilir olduğu bulunan tüm hücrelerin V (ziyaret için) seti . Birini tartışıp diğerini tartışmamak, aynı maliyete sahip olabileceği, benzer çözümler kullanabileceği ve hatta bir araya getirilebileceği için sınırlı bir anlam ifade eder.UV
Unutulmaması gereken ilk şey, tüm izleme GC'nin, bellek hücrelerinin köşeler ve işaretçilerin yönlendirilmiş kenarlar olduğu programdan erişilebilen bellekteki yönlendirilmiş hücre grafiğinin sistematik olarak araştırılmasına dayanan aynı soyut modeli izlemesidir. Bunun için aşağıdaki setleri kullanır:
zaten mutator tarafından erişilebilir durumda bulunan hücrelerin seti (ziyaret edilmiş) , yani GC'nin gerçekleştirildiği program veya algoritma. V grubu iki ayrık alt gruba ayrılır:
V = U ∪ T ;VVV= U∪ T
henüz izlenmemiş işaretçilere sahip ziyaret edilen hücrelerin grubu (takip edilmemiş);U
tüm işaretçilerinin izlendiği ziyaret edilen hücrelerin seti (izlenen).T
Ayrıca , kullanımda olsun veya olmasın, kümedeki tüm hücrelerin kümesini not edin .'H
Algoritmanın çalışması için sadece ve U veya U ve T'nin bir şekilde gösterilmesi gerekir.VUUT
Algoritma, çalışma zamanı sistemi tarafından bilinen bazı kök işaretçilerden başlar (genellikle yığın ayrılmış bellekteki işaretçiler) ve izlemeyen kümesine işaret ettikleri tüm hücreleri koyar (dolayısıyla V de).UV
UcVUcUT
UUV= TV'H- VV
VUUT
Ayrıca hücre nedir, bir boyutta mı, çok sayıda mı geldiğine, bunlarda işaretçileri nasıl bulduğumuza, bunların nasıl sıkıştırılabileceğine ve çöp toplama ile ilgili kitap ve anketlerde bulabileceğiniz diğer teknik sorunlara ilişkin bir çok ayrıntıya atlarım. .
U
Bilinen uygulamaların farklı olduğu yerlerde, bu kümelerin gerçekte temsil edilme şekilleri farklıdır. Aslında birçok teknik kullanılmıştır:
bit eşlemi: Hücrenin adresi kullanılarak bulunabilen her bir hafıza hücresi için bir biti bulunan bir harita için bir miktar hafıza alanı korunur. İlgili hücre, harita tarafından tanımlanan kümedeyken bit açıktır. Eğer sadece bit haritalar kullanılıyorsa, hücre başına sadece 2 bit gerekir.
alternatif olarak, her hücrede özel bir etiket biti (veya 2) işaretlemek için yeriniz olabilir.
günlük2pp
hücrenin içeriği ve işaretçilerine ilişkin bir yüklemeyi test edebilirsiniz.
Hücreyi, yalnızca temsil edilen kümeye ait olan hücrelerin tümü için tasarlanan boş bir belleğe yerleştirebilirsiniz.
VTTU
Aslında bu teknikleri tek bir set için bile birleştirebilirsiniz.
Daha önce de belirtildiği gibi, yukarıdakilerin tümü, bazıları göründüğü kadar garip olan bazı çöp toplayıcılar tarafından kullanılmıştır. Hepsi uygulamanın çeşitli kısıtlamalarına dayanır. Ve sonuç olarak önemli olmadıklarından, bellek kullanımında oldukça ucuz olabilirler, muhtemelen bu amaç için serbestçe seçilebilecek sipariş politikalarının işlenmesiyle yardımcı olabilirler.
En garip görünen, hücreleri yeni bir alana transfer eden, gerçekte çok yaygındır: buna kopya koleksiyonu denir. Daha çok sanal bellek ile kullanılır.
Açıkça, özyinelemenin olmadığı ve mutator algoritma yığınının kullanılması gerekmediği belirtildi.
Bir başka önemli nokta, birçok modern GC'nin büyük sanal anılar için uygulanmış olmasıdır . Daha sonra uygulama yapmak ve fazladan liste veya yığın oluşturmak için yeni sayfalar kolayca tahsis edilebildiğinden sorun olmaz. Bununla birlikte, büyük sanal hatıralarda, düşman alan yetersizliği değil, alan yetersizliğidir . Daha sonra, kümeleri temsil eden yapı ve bunların kullanımı, veri yapısının ve GC uygulamasının yerinin korunmasına yönelik olmalıdır . Sorun uzay değil zamandır. Yetersiz uygulamaların bellek taşma durumundan ziyade kabul edilemez yavaşlama gösterme olasılığı daha yüksektir.
Bu tekniklerin çeşitli kombinasyonlarından kaynaklanan birçok spesifik algoritmaya referans vermedim, bu yeterince uzun görünüyor.