Bir çöp toplayıcı öbekteki nesneleri sıkıştırdığında, yığındaki referansları değiştirir mi?


18

Bu basit bir soru gibi görünüyor, ancak konuyla ilgili çok fazla okumadan sonra, hala kesin bir cevap bulamadım (belki de çok basit olduğu için).

Benim sorum şudur: Çöp toplayıcı öbekteki nesneleri sıkıştırdığında, yığında bu nesnelere yapılan başvurular nasıl güncellenir? İki olası çözümü düşünebilirim:

  1. Yığını (ve yığındaki referansları) gözden geçirin ve referansı nesnenin yeni konumunu gösterecek şekilde güncelleyin. Harekete benzer bir şekilde, bu adresinizi bilen herkese bir mektup göndermek ve onlardan adreslerini yeni adresinizle güncellemelerini istemek gibi bir şey olacaktır.
  2. Bir tür arama tablosu sağlayın. Bu, yerel postaneye bir yönlendirme adresi bırakmak gibidir.

Çöp toplayıcıları ağırlıklı olarak bu iki yöntemden birini kullanıyor mu? Başka bir yöntem? Her ikisi de?



@StevenBurnap yanılıyorsam beni düzeltin, ancak bağlandığınız konunun kesin cevapları olmadığına inanıyorum. Onlar da tam olarak bu soru üzerinde spekülasyon yapıyorlardı. Yanlış okudum. Eğer soruya bir cevap verdiyseler, eğer sakıncası yoksa, gelecekteki SE kullanıcıları (ve ben!) İçin burada cevabı özetlemenin yararlı olacağını düşünüyorum
todorojo 7:13

Bahsettiğiniz şey için bir "hareketli çöp toplayıcı" terimi. Açıkçası ne kadar yaygın kullanıldıklarını bilmiyorum.
Robot

Yanıtlar:


9

Bu konuda özel bir uzmanlığım yok, ancak anlayışım ilk yöntemin genellikle kullanıldığı yönündedir.

Çöp toplayıcı, yığındaki şeylerden yığının nasıl atıfta bulunduğunu bulmak için yığını yine de analiz etmelidir. Bir şeyi hareket ettirmeye karar verdikten sonra, ona referansları düzeltmek zorundadır ve o noktada yığın ve yığın arasında ayrım yapmak için bir neden yoktur.

Prensip olarak arama tablosu yaklaşımı işe yarayabilir. Ancak bu, tüm işaretçi erişimlerinin 2 adım atmasını gerektirir. Bu, normal çalışma süreleri üzerinde büyük bir performans etkisi olacaktır. Özellikle birçok küçük nesnenin kullanım durumu için. (Bu, son teknoloji GC programlarının genellikle referans sayımını geçtiği bir durumdur.)


3
Ben GC muhtemelen gerekmedikçe öbek üzerinde hareket etmemeye çalışıyorum düşünüyorum . Günümüzün çok işlemcili dünyasında, bu referansları kullanan bir program çalışırken öbek üzerindeki bir şeye ilişkin tüm referansları güncellemeleri gerektiğinde bir senkronizasyon kabusu olmalıdır. Arama tablosu bunu basitleştirecekti, ancak bence bu norm yerine istisna, bu yüzden çoğu GC'nin bazı referansları kilitlemesi, belleği taşıması ve ardından referansları güncellemesi gerekiyor. +1 İlginç bir soru, +1 iyi cevap.
GlenPeterson

3
@GlenPeterson Birçok GC, yığın üzerinde bir şeyleri taşımaz ve bu sorunla karşılaşmaz. Ancak, tanım gereği sıkıştırma yapan bir GC, canlı nesneleri bellekte birleştirmek için hareket ettirir.
btilly

@GlenPeterson, öbek üzerinde hareket etmenin büyük bir senkronizasyon ağrısı olduğu iyi bir gözlemdir, GC sıkıştırmasının bu nedenle çalışan bir işlem üzerinde büyük dalgalanma etkileri olmasına rağmen bu göz ardı edilir. Sıkıştırmanın uzun bir muteksi tutmasına neden olan büyük yığın güncellemelerinden kaçınmak için, nesneleri mümkün olduğunca kısa ömürlü tutmak için ellerinden gelen her şeyi yapmaları söylenen en büyük nedendir. Bu şeylerin davranış biçiminin cehaleti, sevgiyle GC Freakout Modu olarak adlandırılan şeye yol açabilir.
Jimmy Hoffa

2
Orijinal Macintosh ve Palm OS, bellek yönetimi için bir arama tablosu yaklaşımı kullandı. Masaya işaretçiler kulp olarak adlandırıldı. Yer değiştiren bir GC, hareket ettiği herhangi bir nesneye kesinlikle her referansın nerede olduğunu bilmelidir; bu amaçlar için tek bir tablo kullanmak işleri büyük ölçüde basitleştirir.
supercat
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.