c # ve çöp toplama

.NET çöp koleksiyonunda şimdilik anlamadığım bir sır olmalı. C # WinForms uygulamamız, OR mapper aracıyla çok fazla nesne yükleyen bir iletişim kutusuna sahip. Bu süreç çok fazla bellek tüketir ve bu belleğin çoğunun dizeler tarafından tüketilebileceğini düşünüyoruz. Bu iletişim kutusunu açtığımızda, görev yöneticisi 900MB'lık bellek kullanımını gösterir ve sorguyu tekrar yaparak bellek dışı bir istisna alırız. Whow.

Şimdi uygulamayı en aza indirdiğimizde bir tür çöp toplama işleminin yapıldığını gördük. Bunu yaparak ve en üst düzeye çıkararak, uygulama sadece 10MB'lar tüketir. Güzel.

Ancak şimdi, sorguyu tekrar yaptığımızda, bellek tüketimi aniden 900 MB'ye atlıyor ve tekrar bellek istisnasından kurtuluyoruz.

Burada ne olur ve hafıza tüketimimizi nasıl azaltabiliriz? Bu gibi durumlarda, hafıza tüketimi nasıl araştırılıp azaltılabilir?

1
Hangi nesnelerin çok fazla bellek aldığını görmek için ANTS Memory Profiler gibi bir araç kullandınız mı?
katma yazar Mike Christensen, kaynak
Görev Yöneticisi tuhaflığı ile ilgili şu soruya bakın: stackoverflow.com/questions/2031577/can-memory-be-cleaned-up‌/& hellip;
katma yazar C. Dragon 76, kaynak
Kendi sorunuzu cevapladınız: çok fazla hafıza kullanmayın!
katma yazar John Saunders, kaynak
Görev Yöneticisi bunu teşhis etmek için değil .
katma yazar Henk Holterman, kaynak
Kodunuzla ilgili bir kavrayış olmadan, bu anlamsız bir sorudur. 900 MB değerinde metin yüklerseniz, bunun maliyeti de budur. Daha az yüklerseniz, yanlış bir şey yapıyorsunuz demektir.
katma yazar Henk Holterman, kaynak
Ne sorduğundan emin değilim. Birisi bellek kullanımını küçültmek istediğinde, açık yaklaşım çok fazla bellek (sorgu gibi) tüketen şeyler yapmıyor. 900 MB'lık nesneler ayırırsanız, bu 900 MB'lık bellek bir şekilde kullanılabilir hale getirilmelidir.
katma yazar delnan, kaynak
Sorun, tek öznitelikleri eşleştirerek fazla bellek tüketen kullanılmış OR mapper'ı olabilir. ANTS'yi şu an için kullanmadık, sadece Visual Studio'nun performans wizzard'ı gerçekten yardımcı olmadı.
katma yazar Peter Buchmann, kaynak
@HenkHolterman: evet. Bir şey yanlıştır ve biz kesinlikle 900MB veri yüklemiyoruz, görev yöneticisinin gösterdiği 900MB, OR mapper tarafından kullanılan geçici veri kaynağı olmalı, ancak geçici veri olduğundan, çöp toplayıcı bir şekilde onları temizleyebilmelidir. yukarı.
katma yazar Peter Buchmann, kaynak

2 cevap

Bütün döngülerin tamamlandığından emin misin? Masaüstü uygulamalarımdaki kaynaklarla ilgili en büyük sorunun, takılıp kalmış veya başarılı şekilde bitmeyen döngüler olduğunu biliyorum. Sorgunuzun doğru bir şekilde geri geldiğinden emin misiniz?

Daha fazlasını yapıyor musunuz? Tüm süreçlerin doğru şekilde başladığından ve tamamlandığından emin olabilirim.

0
katma
Peki, genellikle çok iyi çalışan bu OR mapper kullanıyoruz. Bu durumda bir sorun var. Nesneleri yüklüyoruz ve daha sonra Linq'i kullanarak bazıları arasında ilişki kuruyoruz.
katma yazar Peter Buchmann, kaynak

There are a bunch of .Net Memory Profilers available to help diagnose issues like this. My favorite is dotTrace by JetBrains

0
katma
Bir bellek uzmanı ile çözebileceğim bir problemdi. Dizelerle ilgisi yoktu, bu kodda görülmesi kolay olmayan abonelerin geniş bir kullanımıydı.
katma yazar Peter Buchmann, kaynak