Thread overview
Generational
May 02, 2022
Salih Dincer
May 02, 2022
Salih Dincer
May 02, 2022
Ali Çehreli
May 02, 2022

On Wednesday, 16 December 2020 at 16:45:17 UTC, Ali Çehreli (acehreli) wrote:

>

Çöp toplayıcı geleneksel olarak performansla ilgili belirsizlik sunar. D'nin yakın olduğu dillerden C ve C++ bu yüzden çöp toplayıcıdan uzak dururlar ve hatta onu kötülerler. :) (Öte yandan, "boehm collector" C ve C++'çı Hans Böhm tarafından yazılmıştır.)

C ve C++ nesnelerin belirli zamanlarda sonlandırılmalarının doğru olduğunu savunur (deterministic destruction) ama bazı karşılaştırmalar çöp toplayıcının daha hızlı olabildiğini göstermiştir. (Bartosz Milewski'nin yazıları bu konuya değinir ama şimdi kaynak aramıyorum. :) Örneğin, belirli bir anda sonlandırılan bir C++ nesnesi her elemanı binlerce elemana sahip binlerce elemanlı vector olabilir ve bir sürü temizlik işlemi ve belleğin tek tek geri verilmesi çöp toplayıcının toplam işleminden yavaş olabilir.)

D'nin benzetildiği Java ve C# çöp toplayıcı kullanırlar ve çöp toplayıcıdan pek şikayet etmezler. Python ve başka bir sürü dil de mutlu mutlu çöp toplayıcı kullanır.

Burada önemli olan, çöp toplayıcının gerçekten yavaşlık getirdiği durumlarda D programcısının bir şey yapıp yapamadığıdır:

  • Senin de söylediğin gibi, nogc çöp toplayıcının kullanılmadığını garanti eder.
  • Gerektiğinde malloc vs. ile kendi bellek yönetimimizi sağlayabiliriz.
  • vs.

Bunlara rağmen, D'nin çöp toplayıcısı başka dillerinkiyle karşılaştırıldığında düşük nitelikli olarak kabul edilir. Örneğin, "generational" değildir. Buna rağmen, D runtime bir çöp toplayıcı arayüzü sunar ve kullanıcının kendi çöp toplayıcısını getirmesine izin verir. (Bundan yararlanan proje olduğunu duymadım.)

Yine de, sürekli iyileştiriliyor. Örneğin, bellek tarama işlemi bir iki sene önce "multi-threaded" yapıldı.

Hocam sizin sözlerinizle de okumak isterim: nedir bu Jenerasyonel Çöp Toplayıcı. Gerçi okumaya devam, öğrencez:

https://stackoverflow.com/questions/2257563/what-are-the-generations-in-garbage-collection

Sevgiler...

May 02, 2022

On Monday, 2 May 2022 at 12:37:02 UTC, Salih Dincer wrote:

>

On Wednesday, 16 December 2020 at 16:45:17 UTC, Ali Çehreli (acehreli) wrote:

>

Bunlara rağmen, D'nin çöp toplayıcısı başka dillerinkiyle karşılaştırıldığında düşük nitelikli olarak kabul edilir. Örneğin, "generational" değildir. Buna rağmen, D runtime bir çöp toplayıcı arayüzü sunar

Açıklamaları okurken bana D'deki dinamik dizi ve .capacity kavramını anımsattı. Aslında biz dinamik bir diziyi kullanırken hafızadan boş bir nesne almıyoruz ve kullandıkça boyutu, kullanılmasa bile yükseltiliyor...

Bu konuda ise 0'ı saymazsak 2 temel nesil ve priority var. 0 ise aslında yok gibi bir şey ve adeta bir sahadaki 2 takımın olması gibi. 😀

Yani t0p sahası dediğimiz, 0. nesil yeni oluşturulan ve duruma göre GC'den kısa süreliğine de olsa kurtulan genç nesnelerden oluşuyor. Tıpkı teknik direktörün (burada yazdığımız algoritmanın kendisi) oyuncu değiştitmesine benziyor. Aslında şu açıklamalar öz ve güzel, çok söze gerek bırakmıyor:

>

There's a nice description in "Pro C# 2008":

>
  • Generation 0 identifies a newly created object that has never been marked for collection
>
  • Generation 1 identifies an object that has survived a GC (marked for collection but not removed because there was sufficient heap space)
>
  • Generation 2 identifies an object that has survived more than one sweep of the GC.

Devam edersek, GC bir elek gibi her şeyi filitresinden geçirmiyor ve elekten geçenler kahve bardağında 1 numaralı içimlik kahve statüsüne terfi ediyor yani asıl işi yapan ya da sonuçları saklayan nesneler yaşatılıyor:
Production Result: 1- coffee!

Tabi içilen her kahve nihayetinde midemize girecek ve çoğu mundar olup barsaklara yani çöpe iletilecek! Kana karışına kafein ise (-ki bu çekirdeklerin çok çok küçük bir kısmı ama en değerlisi ve etkilisi) en çok yaşayan ama kanda da çok kalmayacak nesne/nesildir. Yani illa ki beyindeki reseptörlere bağlanıp son görevini icra edecek:
Regeneration Result: 2- nicotine

Basitmiş...

May 02, 2022
On 5/2/22 05:37, Salih Dincer wrote:

> sizin sözlerinizle de okumak isterim

Ben de bilmiyordum. Şimdi aşağıdaki gibi anlıyorum.

Var olan bütün dinamik nesnelerin yaşayıp yaşamadıklarına her temizlik işleminde bakarak zaman harcamayalım. Onun yerine daha akıllı davranalım ve eğer bir nesne bu temizlik işleminde hâlâ yaşıyor ise, olasılıkla bir sonraki temizlik işleminde de yaşayacaktır diye düşünelim.

Öyle nesneleri bir kenara ayıralım ve onlara gerçekten gerekmedikçe hiç bakmayalım. Temizlik işlemlerimiz sırasında yalnızca yeni yaşamaya başlamış olan nesnelere bakalım. Böylece daha az bellek taramış oluruz. Ve eğer program sık sık nesne oluşturup yok ediyorsa, bütün temizlik o kadarcık nesneyle tamamlanıyor ve program hayatına devam edebiliyor demektir. Neden belki de gereksizce bütün bellek alanlarına bakalım? Çöp toplayıcı da zaten sonlandırıcı işlevleri işletme sözü de vermez. Bir anlamda, nesneler öylece takılı kalmış duruyor olabilirler. O konuda da sorun yok demektir.

Bu yöntemin D'ye etkisinin ne kadar olacağını bilmiyorum ama D'nin Java gibi olmadığını biliyorum: D'de her nesne dinamik bellekten oluşturulmaz. Yine de etkisi vardır herhalde çünkü generational çöp toplayıcı konusu bazen D forumlarında da açılıyor.

Ali