Gönderen Konu: .NET'in memory leakleri  (Okunma sayısı 4857 defa)

.NET'in memory leakleri

« : 07.03.2012 19:05:42 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
C++/CLI'da

Kod: [Seç]
Process::GetProcessesByName("myProcessName")
ya da C#/VB.NET'e uyarlarsak

Kod: [Seç]
Process.GetProcessesByName("myProcessName")
bu kadar basit bir kod ne sorun yaratabilir ki di mi? Benim makinemde 350-400 KB'lık bir memory leak yaratıyor. Her 5 sn'de bir bu kodu çağırıp bir process'in ayakta olup olmadığını kontrol etmeye kalktığımda 15 sn'de 1Mb, 15-20 dk içersinde de 4 GB (!) kadar memory leak yaratma potansiyeli var. Garbage Collector mal gibi olan biteni izliyor, müdahele etmiyor. :) Olay da şu. Verdiğiniz process ismini ararken açık tüm processlerden birer obje yaratıyor ama hiçbirini dispose etmiyor. Size de bir referansını döndürmediği için sizin de dispose etme şansınız olmuyor. Yani her halikarda bulunamayan tüm processler ciddi bir memory leak yaratıyor. Bunun yerine siz kendiniz bir loop ile GetProcesses() üzerinden aynı işlemi yaparsanız sorun yok. .NET'in hazır ve nazır bu muhteşem metodunu kullanmaya çalışırsanız vay halinize.

Benim gibi uzun süre memory leak'in kaynağını bulmaya harcamayın diye yazıyorum. GetProcessesByName() cıstır, bu böyle biline. :)

P.S: En azından .NET Framework 3.5'e kadar böyle, belki sonrasında çözmüşlerdir, araştırmadım.

.NET'in memory leakleri

« Yanıtla #1 : 08.03.2012 01:04:04 »
Hızlı düğmeleri aç

endo

İleti: 687

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.moldibi.com
Bilgi için eywallah Skate, acaba garbage collector'u manuel çağırsak bu işlemden sonra, temizlik yapar mı? GC "noluyo lan" demeden çok sayıda obje havada asılı kalıyor olabilir, belki yeterli süre geçebilse kendi başına halledecek olabilir. O yüzden manuel tetiklemek belki işe yarar diye düşündüm..
- endo of glance -

.NET'in memory leakleri

« Yanıtla #2 : 08.03.2012 10:55:37 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
bunu deneyen olmuş, ancak bu sefer de acayip kasılmış elemanın uygulaması. garbage collector'a dışarıdan müdahele etmek de genellikle uzun süreli locklarla son bulabiliyor, hele ki büyük çaplı ve birçok objeyi dinamik olarak yaratan bir uygulaman varsa.

örnek: http://www.experts-exchange.com/Programming/Languages/.NET/Q_25135223.html

bu linkteki sonlara doğru geçen muhabbetlere bir göz atıverin. hatta hatta eleman "aslında bende loopun sonunda sadece bir defa çağırılıyor. GC tetiklemek o kadar sorun olmaz herhalde" gibi birşey demiş. denedikten sonra da "haklısın, uygulamam kasıldı bayaa" gibisinden birşeyler yazmış.

bakın bu da benim söylediğim yöntemi doğrulayan bir link.

http://msdn.microsoft.com/en-us/library/z3w4xdc9(v=vs.90).aspx

sayfanın altındaki Community Content bölümüne dikkat.