none
C# da yazdığım uygulamanın bellekde yer kaplaması ile ilgili soru RRS feed

  • Soru

  • Iyi akşamlar. C# la yapdığım win form uyğulamasında  nerdeyse 50 den fazla form var. Bu formların çoğunda aşağıdakı gibi bir kod satrı var. (bu deyişkenlerde ola bilir). Form her açıldığında orada tanıdığım bu kod satrı bellekde kendine göre bir yer zabt ediyor. Anlıyamadığım form kapadıldıkda bellekden otomotik boşalıyormu? Boşalmıyorsa o biri formlarda açıldıqda daha önceden bellekde yer zabt eden bu kod tekrar yeni yer zabt ediyormu? Yoksa daha önceden bellekde olub olmadığını kontrol etikden sonra yer kaplıyor? Yani bu gibi işlemler için class da yazıb oradan çağırmam bellekde daha az yer kaplar? Biliyorum en mantıklısı kod bir defa yazıliyor farkl farkl yerlerden çağrılmasıdır (kod çok olmaması acısından) Amma benim merak etdiyim tarafı bellekde fazladan yer kaplamasıdır

        string appPath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);

    3 Şubat 2021 Çarşamba 18:32

Yanıtlar

  • .NET uygulamalarının çalışma zamanı CLR organizasyonu ile yürütülür.  CLR içindeki GC mekanizması çöp durumundaki nesnelerin bellekten atılması ile ilgilenir. Eğer C# uygulaması geliştiriyorsanız diğer bazı ender istisnai durumlar haricinde yalnız unmanaged öğeler ile çalışırken belleği düşünürsünüz. Onun dışında geri kalan her şeyi CLR halleder. Sorunuzun cevabını şöyle verebilirim.

    Garbage collector(GC) programın belleğe yüklediği her nesneyi yaşama sürelerini göz önüne alarak gruplandırır. Her oluşan nesne öncelikli olarak 1.jenerasyon kümesine girer. Eğer yeterince süre boyunca o nesnenin referansı olmaya devam ederse bu defa nesne 2.jenerasyon kümesine alınır. Aynı şekilde eğer çok uzun süre referansı olmuşsa GC, o nesneyi 3.jenerasyona taşır. Nesnelerin ayrı kümelerde olmasının sebebi, silme işleminin yükünü azaltmaktır. 

    Yani, Formu kapattığınızda değil, GC'nin harekete geçtiği zaman bellekten atılır. İkinci nesne oluşurken de zaten bellekte var mı diye kontrol edilmez. 

    Diğer arkadaşın söyledikleri doğru değil! GC'ye istisna durumlar haricinde müdahale edilmesi doğru değildir! Çünkü GC'nin çalışmasının da bir maaliyeti vardır. Çalışma maaliyeti biriken çöp nesnelerin bellekten atılma ihityacından daha fazla ise zararda olursunuz ki GC'yi çalıştırmak zaten yalnızca bir öneridir. Bunu istediğinizde kesin olarak yapılacak diye bir kural yoktur! Öte taraftan bir şeyin performans veya bellek tasarrufu kaygısı ile static  veya singleton yapılması da yanlıştır! Tüm uygulama yaşantısı boyunca yalnız bir nesne olması zorunlu veya yeterli ise singleton yapabilirsiniz. Örneğin aynı anda aynı pencereden iki farklı örneği ekranda göstermek isteyebilirsiniz. Bu durumda formu singleton yapmamış olmanız gerekir.

    4 Şubat 2021 Perşembe 11:54

Tüm Yanıtlar

  • Merhaba 

    Eğer bir sınıf ile işin bittiyse GC çağırmalısın. RAM üzerinden kaldırsın. 

    Bir diğer yoluda Singleton Kullanman Araştır. Basit bir örnek olarak

    public class ExampleClass
    {
     private static ExampleClass _Instance
    
     private ExampleClass(){}
    
     public static ExampleClass Instance
     {
       get{
            if( _Instance == null)
              {
                  _Instance=new ExampleClass;          
              }
              return _Instance;
          }
     }
    }
    
    

    3 Şubat 2021 Çarşamba 22:11
  • .NET uygulamalarının çalışma zamanı CLR organizasyonu ile yürütülür.  CLR içindeki GC mekanizması çöp durumundaki nesnelerin bellekten atılması ile ilgilenir. Eğer C# uygulaması geliştiriyorsanız diğer bazı ender istisnai durumlar haricinde yalnız unmanaged öğeler ile çalışırken belleği düşünürsünüz. Onun dışında geri kalan her şeyi CLR halleder. Sorunuzun cevabını şöyle verebilirim.

    Garbage collector(GC) programın belleğe yüklediği her nesneyi yaşama sürelerini göz önüne alarak gruplandırır. Her oluşan nesne öncelikli olarak 1.jenerasyon kümesine girer. Eğer yeterince süre boyunca o nesnenin referansı olmaya devam ederse bu defa nesne 2.jenerasyon kümesine alınır. Aynı şekilde eğer çok uzun süre referansı olmuşsa GC, o nesneyi 3.jenerasyona taşır. Nesnelerin ayrı kümelerde olmasının sebebi, silme işleminin yükünü azaltmaktır. 

    Yani, Formu kapattığınızda değil, GC'nin harekete geçtiği zaman bellekten atılır. İkinci nesne oluşurken de zaten bellekte var mı diye kontrol edilmez. 

    Diğer arkadaşın söyledikleri doğru değil! GC'ye istisna durumlar haricinde müdahale edilmesi doğru değildir! Çünkü GC'nin çalışmasının da bir maaliyeti vardır. Çalışma maaliyeti biriken çöp nesnelerin bellekten atılma ihityacından daha fazla ise zararda olursunuz ki GC'yi çalıştırmak zaten yalnızca bir öneridir. Bunu istediğinizde kesin olarak yapılacak diye bir kural yoktur! Öte taraftan bir şeyin performans veya bellek tasarrufu kaygısı ile static  veya singleton yapılması da yanlıştır! Tüm uygulama yaşantısı boyunca yalnız bir nesne olması zorunlu veya yeterli ise singleton yapabilirsiniz. Örneğin aynı anda aynı pencereden iki farklı örneği ekranda göstermek isteyebilirsiniz. Bu durumda formu singleton yapmamış olmanız gerekir.

    4 Şubat 2021 Perşembe 11:54
  • void'e katılmakla birlikte, ayrıca singleton'un pattern mi anti-pattern mi olduğu tartışmalıdır. 

    www.cihanyakar.com

    4 Şubat 2021 Perşembe 19:54