Thread overview
Bellek Kullanim Raporu
Aug 29, 2019
kerdemdemir
Aug 30, 2019
Salih Dinçer
August 30, 2019

Merhaba

Uygulamamim bellek kullanimi zamanla artiyor. Ipin ucunun nerde kactigini anlayabilmem icin bellek analizi yapmam gerekiyor.
Ben bunu C++ programlarimda yapmak istedigimde "valgrind --tool =massif" kullaniyorum. Ve arayuz programlari yardimi ile "flame graph" diye bir cikti olusuyor surda gorulebilir :< https://stackoverflow.com/questions/1623771/valgrind-massif-tool-output-graphical-interface>

D 'de buna benzer ne yapabilirim bilen var mi ?

D dilinde soyle bir ayar varmis programi derlerken : "dub build --build=profile-gc" kullanan oldu mu ?

Erdemdem

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

August 30, 2019

Ben kullandım. Bir de programa komut satırından eklenen '‑‑DRT‑gcopt=profile:1' seçeneği var. Ama bunlar bellek sızıntısını göstermiyorlar; çöp toplayıcıyla ilgili istatistikler gösteriyorlar. Birisi çıktıya yazıyor; diğeri dosyaya yazıyor. (İkisini de dene; farklı bilgi veriyorlar.)

Eğer zaten öyle değilse, programını 64 bitlik derlemeyi deneyebilirsin. Öyle yapınca, tamsayıların yanlışlıkla bellek adresi gibi algılanma olasılığı çok çok azalıyor. (Tabii eğer sorun bununla ilgiliyse.)

Bir de, bellek sürekli artıyorsa evet, sızıntı var demektir. Ama arttıktan sonra bir noktada duruyorsa sorun yok demektir. :)

Senin soruna yanıt veremiyorum ama performansla ilgili olarak da bellek ayırmayı olabildiğince üst düzeylerde yapmak gerek. Örneğin, çok kullanılan bir işlevde (örneğin yukarıdaki profile çıktılarının gösterdiği bir işlevde), şunun yerine:

void foo() {
 while (durum) {
   int[] dizi;
   while (başkaDurum) {
     dizi ~= eklenen;
     // ...
   }
 }
}

Şunu yeğlemek çok büyük yarar getirebiliyor:

void foo() {
 int[] dizi;  // Dizi dışarı alındı
 while (durum) {
   dizi.length = 0;    // Her döngüde daha önce ayrılmış olan dizi alanı tekrar kullanılır
   while (başkaDurum) {
     dizi ~= eklenen;
     // ...
   }
 }
}

Hatta, daha ileri gidip diziyi foo()'nun static değişkeni yapınca foo()'nun her çağrılışı daha önceki çağrılarda kullanılan aynı diziyi kullanmış olacak:

void foo() {
 static int[] dizi;  // Dizi static oldu
 while (durum) {
   dizi.length = 0;    // Her döngüde daha önce ayrılmış olan dizi alanı tekrar kullanılır
   while (başkaDurum) {
     dizi ~= eklenen;
     // ...
   }
 }
}

Ben bunu Appender ile kullanmıştım. O zaman .length=0 yerine .clear() kullanılıyor.

Ek olarak, static değişkenler C++ gibi dillerde multithread sorununa neden olabilirler ama D'de thread-local olduklarından sorun olmuyor: her thread'in foo() işletirken kendi 'dizi'si oluyor. (Dikkat: Yine de, static değişken işlevi non-reentrant yapar. Yani foo()'nun başka işlevi çağırması ve o işlevin dolaylı da olsa foo()'yu tekrar çağırması ilk girilmiş olan foo()'nun da kullanmakta olduğu aynı 'dizi'yi temizleyecektir.)

Ali

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

August 30, 2019

Alıntı (acehreli):

>

Ben kullandım. Bir de programa komut satırından eklenen '‑‑DRT‑gcopt=profile:1' seçeneği var. Ama bunlar bellek sızıntısını göstermiyorlar; çöp toplayıcıyla ilgili istatistikler gösteriyorlar. Birisi çıktıya yazıyor; diğeri dosyaya yazıyor. (İkisini de dene; farklı bilgi veriyorlar.)
Belki dosyaya yazanı denemeliyiz ne dersiniz? Oluşan dosyayı pekala bir massif-visualizer benzeri bir grafiğe çevirebiliriz. En azından birinden başlanır ve zamanla daha çok veriyi ekrana yansıtmayı deneyebiliriz.

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