Thread overview
Çöp toplayıcı hakkında
Jan 31, 2012
zafer
Apr 27, 2013
Salih Dinçer
January 31, 2012

Merhaba,

Şu çöp toplayıcı olayına takıldım, bilmiyorum belkide hiç anlamadım. Öncelikle bu çöp toplayıcı nerededir, ne zaman ve nasıl çalışır, Kim ve niçin çalıştırır. D ortamı kurulu olmayan bir sistemde D ile oluşturduğumuz program çalıştığında çöp toplayıcıyı kim nereden çağırır, nerede nasıl kurar ??

Kısaca bu çöp toplayıcının hayat döngüsü nedir?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 31, 2012

Alıntı (zafer):

>

Öncelikle bu çöp toplayıcı nerededir

Çöp toplayıcı her D programa otomatik olarak bağlanan ve "D runtime" denen çalışma zamanı ortamının parçasıdır. D'de kullandığımız ve açıkça new ile oluşturmadığımız nesneler druntime tarafından otomatik olarak oluşturulurlar.

   int[] d = [ 1, 2, 3 ];

O dizinin elemanları çöp toplayıcıya aittirler. Ama tabii d dizisi yaşadığı sürece onlar yok olmazlar.

Alıntı:

>

ne zaman ve nasıl çalışır, Kim ve niçin çalıştırır.

Onun algoritmasının ayrıntılarını bilmiyorum ama genelde çöp toplayıcının belleğı azalmaya başlayınca (veya belirli aralıklarla) "bir temizlik yapalım" denir ve artık referansı bulunmayan bellek bölgelerindeki nesneler sonlandırılırlar ve yaşadıkları bellekler daha sonradan başka nesneler için kullanılmak üzere geri alınır.

Bu C++'tan gelenlere çok garip gelen bir durumdur. (Bakınız ben! :)) C++'ta sonlandırıcı işlevin hangi an işletileceği bellidir. D'de ise ileride belirsiz bir zamanda işletilir. Hatta işletileceğinin garantisi bile yoktur.

Alıntı:

>

D ortamı kurulu olmayan bir sistemde D ile oluşturduğumuz program çalıştığında çöp toplayıcıyı kim nereden çağırır, nerede nasıl kurar ??

D, Java veya .Net gibi bir ortamla gelmez. Aslında çalışma ortamı var diyoruz ama öteki diller gibi bir sanal makine değildir. Yani her programın çöp toplayıcısı kendi içindedir.

Aslında D kurulduğunda da yalnızca dmd ve yan programları kuruluyor. Sürekli işleyen bir ortam yok. dmd'nin işi bittiğinde program işlemeye hazırdır. (Tabii .so veya .dll kütüphaneleri kullanıyorsa o zaman onların da mevcut olmaları gerekir.)

Alıntı:

>

Kısaca bu çöp toplayıcının hayat döngüsü nedir?

Şurada biraz bilgi var:

http://ddili.org/ders/d/bellek_yonetimi.html

Hataları ve eksikleri bildiriniz! :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 27, 2013

Çöp toplayıcı defragment yapıyor mu?

Yani uzun süre çalışan bir uygulama düşünün. Zaman zaman yeni sınıflar meydana getirilip işleri bitince imha ediliyor. Elbette çöp toplayıcı her zaman değil, gerektiği zaman artık kullanılmayan belleği OS'e emanet ediyor.

İşte bu aşamada kim yapıyorsa belleğin parçalanması işletim sisteminin sorumluluğunda mı? Yoksa GC, bir sınıf bellek talep ettiğinde, toplam talep edilen kapasite kadar bellekte boş bir alan mı arıyor? Belki de arama işlemini GC yapmıyor, OS'a bırakılıyor olabilir mi?

Son biri soru...

Belleği daha verimli kullanmak için, örneğin bir dizinin elemanlarını boş olan yerler ile mi ilişkilendirlir. Yoksa işlemciyi daha etkin kullanmak için dizi boyutu kadar bir boş yer mi aranır?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 27, 2013

Alıntı (Salih Dinçer):

>

Çöp toplayıcı defragment yapıyor mu?

D bu konuda bir kısıtlama getirmiyor. Kullanılan çöp toplayıcıya bağlı bir konu. dmd'nin çöp toplayıcısı Java'nın ilk zamanlarındakine benzeyen ilkel bir çöp toplayıcı ama DConf 2013'te çöp toplayıcı üzerine iki konuşma var:

http://dconf.org/talks/lucarella.html

http://dconf.org/talks/schuetze.html

Yakında bu konuda gelişme bekleyebiliriz.

Alıntı:

>

İşte bu aşamada kim yapıyorsa belleğin parçalanması işletim sisteminin sorumluluğunda mı? Yoksa GC, bir sınıf bellek talep ettiğinde, toplam talep edilen kapasite kadar bellekte boş bir alan mı arıyor?

Tam emin değilim ama bildiğim kadarıyla şöyle: Programın çöp toplayıcısı işletim sisteminden bir miktar bellek istiyor ve alıyor. O noktadan sonra işletim sisteminin o bellekle hiçbir işi kalmıyor. Çöp toplayıcı orayı istediği gibi kullanıyor. Pool allocator'ların yaptığı gibi, o belleğin bölümlerini nesne büyüklüklerine göre kullanabilir: En küçük olanlar şuraya, biraz daha büyük olanlar buraya, vs.

Alıntı:

>

Belki de arama işlemini GC yapmıyor, OS'a bırakılıyor olabilir mi?

Her ikisi de arama yapıyor. İşletim sistemi çöp toplayıcının istediği kocaman alanı arıyor; çöp toplayıcı da programın istediği büyüklükler için o bellekte kendisi arıyor.

Alıntı:

>

Belleği daha verimli kullanmak için, örneğin bir dizinin elemanlarını boş olan yerler ile mi ilişkilendirlir. Yoksa işlemciyi daha etkin kullanmak için dizi boyutu kadar bir boş yer mi aranır?

Soruyu anlamadım ama şu gerçek bozulamaz: Bir dizinin elemanları bellekte yan yana bulunmak zorundadırlar: Onuncu eleman, birinci elemanın adresinden 10 eleman ötededir. Buna göre, dizinin boyu büyüdükçe bütün elemanların sığacağı kadar yeni bir yer edinilir ve elemanlar oraya kopyalanır. Bu aşamanın tam olarak nasıl işlediğini biliyoruz:

http://ddili.org/makale/d_dilimleri.html

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]