none
Belleğin kirlenmesi RRS feed

  • Soru

  • Yazılımda neden çalıştıkça bellek tükeniyor bunu merak ediyorum

     Dim dt As DataTable  gibi işlemler prosedür içinde çalışıp biten işlemler ama bunlar bellekteki varlığını kirlilik olarak koruyor sanki kendini silmiyormu acaba. Yada rutinler içindeki dizinler filan işi bitince kalıyormu ram de bir yerlerde kirlilik olarak. Yazılımcı prensibi burada nasıl olmalı çıkarken bunlar silinmeli boşaltılmalı yok edilmeli filanmı. Bir prosedürün içinde değişken tanımlarsan o prosedür bitince değişkenler işlevsizdir bunlar hala bir şekilde yermi kaplıyor bellekte acaba neden yazılım çalıştıkça bellek biraz tükeniyor. Çokta tükenmiyor aslında her işi biten değişken kalsa yazılım kasılır kalır bir iki saatte ama yinede ben izliyorum deniyorum biraz ram tüketiyor çalıştıkça. Bence bir kötü kot yazma tarzı var benim çalışmalarımda bunu araştırıyorum. Bu konuda bazı prensipleriniz varmı kot yazarken belleği iyi yönetme konusunda. 


    • Düzenleyen hakan1992 18 Haziran 2019 Salı 07:00
    18 Haziran 2019 Salı 06:58

Tüm Yanıtlar

  • C# Dispose

    .Net Developer

    18 Haziran 2019 Salı 14:59
  • Biraz deneme yaptım sizin kaynağı okuduktan sonra hiç değişkenler ile olacak iş değil o yavaşlama. 300 milyon string değişkene değer atadım banamısın demedi pc kapatıncada şak diye ram i eski haline getiriyor. O arasıra olan kasılma çok devasa bir bellek tüketimi bizim yazılımdaki değişkenler ile zerresi bile yapılamaz gibi görünüyor. Belki sqlite dll i yapıyor onu 
    18 Haziran 2019 Salı 17:31
  • C# Dispose

    .Net Developer

    Yazı dispose'un en az kullanıldığı yere fazla odaklanmış. Yönetilen nesnelerin daha hızlı kaldırılması olayı çok nadir ihtiyaç duyulan bir olaydır. Büyük nesnelerde zaten GC farklı politika izler. 

    Dipsose'un temel amacı yönetilmeyen, uygulamanın haricinde oluşturulan nesnelerin temizlenmesidir ki yazı buna yalnızca kalıtım yoluyla değinmiş. Bununla ve .net'in çalışma prensiplerine ilişkin ilgili çok daha düzgün içeriklere CLR via C# kitabından ulaşabilirsiniz. .net de uzmanlaşmak isteyen birisinin mutlaka en az iki kere okuması gereken bir kitap kendisi. Fakat .net core ile bir çok şeyin baştan ele alındığını da unutmamak lazım.


    www.cihanyakar.com


    18 Haziran 2019 Salı 19:04
  • Deleted
    18 Haziran 2019 Salı 19:08

  • Programcının prensibine gelince, şayet bir şey referans türlü olduğunda işi biter bitmez hemen bellekten atılması bekleniyor ise arkadaşımızın dediği IDisposable yolu izlenebilir. Ancak değer türlü bir şeyler için yapabileceğiniz bir şey yoktur, gerek yoktur. Bu tip deneyimler daha çok dilin prensipleri, programlama ve veri yapıları gibi konular üzerinde araştırmalar yaptıkça edinilebiliyor. 



    Amelelik olur tabii bu. Biter bitmez bellekten atmanın anlamı yok (MS hemen bellekten kaldırmayı bilmiyor muydu? bunu neden yapmadıkları kitap örneğimde yazıyor), önemli olan bellekten atılacağının bilinmesidir. Prensip gereksiz referans bırakmamaktır.  Her şeyi durduk yere public tanımlamayarak başlayabilirsiniz :) En çok yapılan hata ise eventhandler'lar üzerinden referans bırakmakla olur. Bir çok nesne ekrandan kaldırılır ama başka bir nesneden eventhandler bağlanmıştır. Bu sebeple o nesne arkada yaşamaya devam eder. Weakreference ve Weakevents konuları bu gibi konuları çok güzel çözer.

    www.cihanyakar.com





    18 Haziran 2019 Salı 19:19
  • Deleted
    18 Haziran 2019 Salı 21:41