Kısaca
Sonlandırma, çöp toplayıcıların yapması gereken basit bir mesele değildir. Referans sayma GC ile kullanmak kolaydır, ancak bu GC ailesi genellikle eksiktir; bellek sızıntılarının, bazı nesnelerin ve yapıların açık bir şekilde imha edilmesi ve sonlandırılmasıyla telafi edilmesini gerektirir. Çöp toplayıcılarının izlenmesi çok daha etkilidir, ancak kullanılmayan hafızayı tanımlamak yerine, sonuç ve imha edilmek istenen nesneyi tanımlamayı çok daha zorlaştırır, sadece kullanılmayan hafızayı tanımlamak yerine, böylece daha karmaşık bir yönetim gerektiren, zaman ve mekanda ve karmaşıklığı gerektiren hayata geçirme.
Giriş
İstediğiniz şeyin çöp toplama dillerinin neden açıklamada belirtildiği gibi çöp toplama işlemi içindeki otomatik olarak imha / sonlandırma işlemlerini gerçekleştirmediğini farz ediyorum:
Bu dillerin hafızayı yönetmeye değer tek kaynak olarak gördüğünü çok az buluyorum. Peki ya yuvalar, dosya tutamaçları, uygulama durumları?
Kdbanman tarafından verilen kabul edilen cevaba katılmıyorum . Belirtilen gerçekler çoğunlukla doğru olmakla birlikte, referans sayımına yönelik kuvvetli bir önyargı olmasına rağmen, soruda şikayet edilen durumu doğru şekilde açıkladıklarına inanmıyorum.
Bu cevapta geliştirilen terminolojinin bir sorun olduğuna inanmıyorum ve işleri karıştırması daha olası. Aslında, sunulduğu gibi, terminoloji çoğunlukla, yaptıklarından ziyade prosedürlerin aktive edilmesiyle belirlenir. Mesele şu ki, her durumda, bir miktar temizleme işlemi ile artık ihtiyaç duyulmayan bir nesneyi sonlandırmaya ve kullandığı kaynakları serbest bırakmaya, hafızanın sadece bir tanesi olmasına ihtiyaç duyulması gerekiyor. İdeal olarak, nesnelerin artık bir çöp toplayıcısı aracılığıyla kullanılmayacak olması durumunda, bunların tümü otomatik olarak yapılmalıdır. Uygulamada, GC eksik veya eksik olabilir ve bu sonuçlandırma ve geri kazanma programı tarafından açıkça tetiklenmesi ile telafi edilir.
Program tarafından açık bir şekilde tetikleme bir problemdir, çünkü halen kullanılmakta olan bir nesne açıkça sonlandırıldığında programlama hatalarının analizini zorlaştırabilir.
Bu nedenle, kaynakları geri kazanmak için otomatik çöp toplamaya güvenmek çok daha iyidir. Ancak iki sorun var:
Bazı çöp toplama tekniği, kaynakların tamamen geri kazanılmasını önleyen bellek sızıntılarına izin verecektir. Bu, referans sayımı GC için iyi bilinmektedir, ancak bazı veri organizasyonlarını dikkatsizce kullanırken diğer GC teknikleri için görünebilir (burada tartışılmayan nokta).
GC tekniği artık kullanılmayan bellek kaynaklarını tanımlamakta iyi olabilirken, içerdiği nesneleri sonlandırmak basit olmayabilir ve bu genellikle bu nesneler tarafından kullanılan ve genellikle sonlandırmanın amacı olan diğer kaynakları geri alma sorununu zorlaştırır.
Son olarak, sıklıkla unutulan önemli bir nokta, GC kancalarının uygun kancalar sağlanmışsa ve bir GC döngüsünün maliyetinin buna değdiği takdirde, sadece bellek sıkıntısı değil, herhangi bir şey tarafından tetiklenebilmesidir. Bu nedenle, bazılarını serbest bırakma umuduyla, herhangi bir kaynak eksik olduğunda bir GC başlatmak iyidir.
Referans sayma çöp toplayıcıları
Referans sayımı, döngüleri doğru şekilde işlemeyecek zayıf bir çöp toplama tekniğidir . Eski yapıları tahrip etmek ve diğer kaynakları geri almak, sadece hafızayı geri kazanmakta zayıf olduğu için gerçekten zayıf olurdu. Ancak sonlandırıcılar, bir referans sayma çöp toplayıcısı (GC) ile en kolay şekilde kullanılabilir, çünkü bir ref-sayma GC, ref sayısı 0'a düştüğünde bir yapıyı geri alır, bu sırada adresi, türü ile birlikte ya da statik olarak bilinir. veya dinamik olarak. Bu nedenle, uygun sonlandırıcıyı uyguladıktan sonra belleği tam olarak geri kazanmak ve işlemi tüm sivri uçlu nesnelerde (muhtemelen sonlandırma prosedürü yoluyla) tekrar tekrar çağırmak mümkündür.
Kısaca, sonuçlandırma Ref Sayma GC ile gerçekleştirilmesi kolaydır, ancak aslında dairesel yapılardan ötürü GC'nin "eksikliğinden" ziyade, hafıza kazanımının tam olarak aynı derecede olması gerekir. Başka bir deyişle, referans sayımı ile bellek, yuvalar, dosya tanıtıcıları, vb. Gibi diğer kaynaklar kadar zayıf bir şekilde yönetilir .
Gerçekten de, Ref Say GC , döngüsel yapıların geri kazanılmasındaki yetersizlik (genel olarak) bellek sızıntısı olarak görülebilir . Tüm GC’lerin bellek sızıntılarından kaçınmasını bekleyemezsiniz. GC algoritmasına ve dinamik olarak mevcut olan tipte yapı bilgisine (örneğin
muhafazakar GC'de ) bağlıdır.
Çöp toplayıcılarının izlenmesi
Bu tür sızıntılar olmadan daha güçlü GC ailesi , iyi tanımlanmış kök işaretçilerinden başlayarak hafızanın canlı kısımlarını araştıran izleme ailesidir . Hafızanın bu izleme sürecinde ziyaret edilmeyen tüm kısımları (çeşitli şekillerde ayrı ayrı ayrıştırılabilir, ancak basitleştirmek zorundayım), hafızanın kullanılmayan kısımlarıdır, bu nedenle geri kazanılabilir 1 . Bu koleksiyonerler, ne olursa olsun, program tarafından erişilemeyen tüm hafıza parçalarını geri alacaktır. Dairesel yapıları geri kazanıyor ve daha gelişmiş GC bu paradigmanın bazı varyasyonlarına dayanıyor, bazen oldukça karmaşık. Bazı durumlarda referans sayımı ile birleştirilebilir ve zayıf yönlerini telafi edebilir.
Bir sorun, ifadenizin ( sorunun sonunda) olmasıdır:
Otomatik çöp toplama hizmeti sunan diller, bir nesnenin artık kullanılmadığı durumlarda% 100 kesinlikte olduğu gibi, nesnelerin imha edilmesini / sonlandırılmasını destekleyen ana adaylar gibi görünmektedir.
koleksiyoncuları izlemek için teknik olarak yanlıştır .
% 100 kesin olarak bilinen şey, hafızanın hangi kısımlarının artık kullanılmadığıdır . (Daha doğrusu, artık erişilebilir olmadıkları söylenmelidir , çünkü program mantığına göre artık kullanılamayan bazı kısımlar, programda hala işe yaramaz bir işaretçi varsa, kullanımda olduğu düşünülmektedir. veri.) Ancak , hafızanın bu kullanılmamış kısımlarında hangi kullanılmamış nesnelerin saklanmış olabileceğini bilmek için daha fazla işlem ve uygun yapılara ihtiyaç vardır . Program hafızanın bu kısımlarına bağlı olmadığı için program tarafından bilinenlerden tespit edilemez.
Böylece bir çöp toplama işleminden sonra, artık kullanılmayan nesneleri içeren bellek parçaları kalır, ancak bu nesnelerin doğru sonlandırmayı uygulamak için ne olduklarını bilmenin bir yolu yoktur. Ayrıca, eğer izleyici toplayıcı işaretleme ve tarama tipi ise, parçaların bir kısmı daha önce GC geçişinde sonlandırılmış, ancak parçalanma nedenlerinden dolayı kullanılmamış nesneler içerebilir. Ancak bu, genişletilmiş açık tipli yazım kullanarak ele alınabilir.
Basit bir koleksiyoncu yalnızca bu bellek parçalarını geri alırken, daha fazla uzatmadan, sonlandırma kullanılmayan belleği keşfetmek, içerdiği nesneleri tanımlamak ve sonlandırma prosedürlerini uygulamak için belirli bir geçişi gerektirir. Ancak böyle bir keşif, orada saklanan nesnelerin türünün belirlenmesini gerektirir ve varsa uygun sonlandırmayı uygulamak için de tür belirlenmesi gerekir.
Bu, GC zamanındaki ekstra masrafları (ekstra geçiş) ve bu teknikte çeşitli tekniklerle uygun tip bilgiyi elde etmek için muhtemelen ekstra bellek maliyetlerini gerektirir. Bu maliyetler, çoğu zaman yalnızca birkaç nesneyi sonuçlandırmak isteyeceği için önemli olabilir, buna ek olarak zaman ve mekan genelindeki tüm nesneler ile ilgili olabilir.
Başka bir nokta, zaman ve mekan ek yükünün sadece GC yürütme ile değil, program kod yürütme ile ilgili olabileceğidir.
Belirli konulara işaret ederek daha kesin bir cevap veremem, çünkü listelediğiniz dillerin çoğunun özelliklerini bilmiyorum. C durumunda, yazmak, muhafazakar koleksiyoncuların gelişmesine yol açan çok zor bir konudur. Tahminim bunun C ++ 'ı da etkileyeceği, ancak C ++ konusunda uzman değilim. Bu muhafazakar GC hakkındaki araştırmaların çoğunu yapan Hans Boehm tarafından onaylanmış görünüyor . Muhafazakar GC, sistematik olarak kullanılmayan tüm bellekleri tam olarak geri alamaz, çünkü veriler üzerinde kesin tip bilgisi olmayabilir. Aynı nedenle, kesinleştirme prosedürlerini sistematik olarak uygulayamazdı.
Yani, bazı dillerden bildiğiniz gibi, istediğinizi yapmak mümkündür. Ama bedava gelmiyor. Dile ve uygulanmasına bağlı olarak, bu özelliği kullanmadığınızda bile bir maliyet getirebilir. Bu sorunları ele almak için çeşitli teknikler ve takaslar düşünülebilir, ancak bu makul bir cevap kapsamı dışındadır.
1 - Bu, toplama koleksiyonunun (hem kopya hem de işaretleme ve tarama işlemlerini içeren) soyut bir sunumudur, işler, izleme toplayıcısının türüne göre değişir ve hafızanın kullanılmayan kısmını araştırmak, kopyalamanın veya işaretlemenin ve süpürme kullanılır.
finalize
/destroy
yalan mı? Yürütüleceğine dair hiçbir garanti yok. Ve bile, ne zaman (otomatik çöp toplama verildiğinde) ve gerekli bağlam hala orada (zaten toplanmış olabilir) bilmiyorsunuz. Dolayısıyla, tutarlı bir durumu başka yollarla sağlamak daha güvenlidir ve kişi programlayıcıyı buna zorlamak isteyebilir.