"Memory Leak" anatomisi

oy
159

.NET perspektifte:

  • Bir nedir bellek sızıntısı ?
  • Nasıl başvuru sızıntıları olmadığını belirleyebilir? etkileri nelerdir?
  • Nasıl bir bellek sızıntısı önleyebilir?
  • Başvurunuz bellek sızıntısı varsa işlem çıkar veya öldürülürse, bunun uzağa gider? Ya uygulamanızda bellek sızıntıları bile süreç tamamlandıktan sonra sistem üzerinde diğer işlemleri etkiler?
  • Ya COM birlikte ve / veya P üzerinden erişilebilir yönetilmeyen kod hakkında / çağırmak?
Oluştur 01/08/2008 saat 16:12
kaynak kullanıcı
Diğer dillerde...                            


15 cevaplar

oy
106

Gördüğüm en iyi açıklama özgür 7. bölümünde ise Programlama E-kitabın Vakıflar .

Temel olarak, içinde .NET başvurulan nesnelerini çöp toplama edilemez böylece köklü ve zaman bellek sızıntısı oluşuyor. Amaçladığınız alan dışında referanslara tutmak, bu yanlışlıkla oluşur.

Sen (siz elde OutOfMemoryExceptions başlatmak veya bellek kullanımı beklediğiniz ötesine kadar gittiğinde sızıntıları olduğunu bileceksiniz PerfMon güzel bellek sayaçları vardır).

Anlamak .NET 'in bellek modeli bunu kaçınmanın en iyi yoludur. Özellikle, çöp toplayıcı nasıl çalıştığını anlamak ve nasıl referanslar çalışmak - yine ben, e-kitabın bölüm 7 havale. Ayrıca, muhtemelen en yaygın olanı olaylar yaygın tehlikelerin dikkatli olun. Nesne Eğer bir nesne üzerinde bir olaya kayıtlı olduğu B , daha sonra nesne A nesne kadar etrafında dolanır B çünkü kaybolur B başvuru tutan bir . Solüsyon İşin bitince etkinliklerinizi kaydını etmektir.

Tabii ki, iyi bir hafıza profili Eğer nesne grafikleri görelim ve referanslar nereden geldiğini görmek için nesnelerin yuvalama / referanslama keşfetmek ve hangi kök nesnesi (sorumludur edecek kırmızı-gate karıncalar profil , JetBrains dotMemory, MemProfiler gerçekten iyi seçimler veya salt metin kullanabilir WinDbg'yi ve SOS ), ancak gerçek guru olmadıkça şiddetle ticari / görsel ürünü öneriyoruz.

Bunu paylaşılan referanslar çöp toplayıcı tarafından yönetilir dışında yönetilmeyen kod, onun tipik hafıza sızıntıları tabi olduğuna inanıyoruz. Bu son nokta hakkında yanlış olabilir.

Cevap 01/08/2008 saat 16:28
kaynak kullanıcı

oy
32

Açıkçası, bir bellek sızıntısı programı tarafından "artık kullanılmamaktadır" dır bellek tüketiyor.

"Artık kullanılan" birden fazla anlamı vardır, o, tamamen kurtarılamaz ise, "kendisine artık referansı" anlamına gelebilir, ya da anlamına gelebilir, başvurulan kullanılmamış, geri kazanılabilir ancak program zaten referansları tutar. Sadece sonrası için .NET için geçerlidir mükemmel yönetilen nesneler . Ancak, tüm sınıfları mükemmel ve bir noktada altta yatan yönetilmeyen uygulama bu işlem için kalıcı kaynak sızıntı olabilir.

Her durumda, uygulama kesinlikle gerekli olandan daha fazla bellek tüketir. taraf etkileri, sızdırılan kestirmeniz bağlı hafıza istisnalar bir dizi ve zorla süreç fesih ardından nihayet ölümcül hata nedeniyle, aşırı toplama kaynaklanan yavaşlama, hiçbiri gelen gidebiliriz.

Sen izleme daha fazla bellek süreci tahsis edilmesini gösterdiğinde bir uygulama bellek sorunu var biliyorum her çöp toplama döngüsünden sonra . Bu durumda, ya bellekte çok fazla tutuyor veya bazı temel yönetilmeyen uygulama akıyor.

En sızıntılar için, kaynaklar işlem sonlandırıldığında iyileşti vardır, ancak bazı kaynaklar her zaman bazı hassas durumda kurtarılamaz değildir, GDI imleç kolları o meşhurdur. Bir arası iletişim mekanizması varsa o süreç o boşaltır veya sonlandırır kadar Elbette, diğer süreç içinde ayrılan bellek serbest değil.

Cevap 01/08/2008 saat 18:52
kaynak kullanıcı

oy
28

Ben düşünüyorum ve "bir bellek sızıntısı ne" soruları zaten iyi cevap olmuştur, ama diğer sorular üzerinde birkaç şey daha eklemek istedim "etkileri ne" ...

Nasıl uygulama sızıntıları olup olmadığını anlamak için

Bir ilginç bir yol açmaktır perfmon ve Đzlemelerdeki eklemek bütün yığınları içerisinde bayt ve # Gen 2 koleksiyonları sadece süreci bakarak her durumda. Belirli bir özelliği egzersiz toplam bayt artmasına neden olur ve bu bellek sonraki Gen 2 toplandıktan sonra ayrılan kalır, özelliğin bellek sızdırıyor söylenebilir.

Nasıl önlemek için

Diğer iyi görüşler verilmiştir. Sadece belki de bu eklersiniz en sık gözden kaçan NET bellek sızıntıları nedeni onları çıkarmadan nesnelere olay işleyicileri eklemektir. Bir nesneye bağlı bir olay işleyicisi o nesnenin referans şeklidir, bu nedenle tüm diğer referanslar gitti sonra bile koleksiyonunu önleyecektir. Her zaman (kullanarak olay işleyicileri ayırmak hatırlamak -=C # sözdizimi).

Kaçak zaman süreci çıkışlar ve ne COM birlikte yaklaşık uzağa gider mi?

senin süreç sonlandığında, onun adres alanına girmesine tüm bellek herhangi bir COM nesneleri DLL'lerden sunulan reklamlar dahil, OS tarafından ıslah edildiğinde. Nispeten nadir, COM nesneleri ayrı işlemlerini servis edilebilir. Bu durumda, sizin süreç çıktığında, hala kullanılan herhangi bir COM sunucu süreçlerinde ayrılan bellek için sorumlu olabilir.

Cevap 15/08/2008 saat 17:11
kaynak kullanıcı

oy
18

NET'te bellek sızıntısı teşhis etmek gerekirse, bu bağlantıları kontrol edin:

http://msdn.microsoft.com/en-us/magazine/cc163833.aspx

http://msdn.microsoft.com/en-us/magazine/cc164138.aspx

O Makaleler sürecin bir bellek dökümü oluşturmak ve kaçak yönetilmeyen veya yönetilen ise ilk önce belirleyebilmesi için nasıl analiz anlatan ve yönetildiği takdirde, nasıl nereden geldiğini anlamaya.

Microsoft ayrıca DebugDiag denilen ADPlus, yerine, üreten kazasında döker yardımcı olmak için yeni bir araç vardır.

http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en

Cevap 15/08/2008 saat 00:16
kaynak kullanıcı

oy
18

Bir nesne tamamlandıktan sonra ayrılan tüm bellek boşaltma değil bellek sızıntıları tanımlamak olacaktır. Sana çerçevesinde ve üçüncü parti bileşenleri, (içinde bir hata vardır veya doğru yönetilmiyordur yani yönetilmeyen kod), Windows API ve COM kullanıyorsanız, bu uygulamanızda gerçekleşebilir bulduk. Ben de soruna neden olabilir kalem gibi bazı nesneleri kullanarak sonra tiding değil bulduk.

Ben şahsen neden ama net nokta uygulamalarda bellek sızıntıları münhasır değildir edilebilir Bellek İstisnalar dışında acı çekti. (OOM ayrıca bkz iğneleme gelebilir Sabitleme ARTICAL ). OOM hataları alıyorsanız ya da daha sonra tek yolu uygulama profil olduğunu neden bir bellek sızıntısı olup olmadığını doğrulamak için gereken değilseniz.

Ben de denemek ve şu sağlayacak:

a) ıdisposable uygulayan herşey ya bir nihayet engellemek kullanılarak imha edilmesini veya bu vb fırçalar, kalemler (bazı insanlar ek olarak hiçbir şey için her şeyi ayarlamak için iddia) gibi ifadesini kullanarak

b) nihayet kullanarak tekrar kapatılır yakın yöntemi kullanılarak veya deyimi (vardır her şey kullanarak deyimi dışında nesneyi ilan eğer hep yakın bağlı değildir kullanarak bulduk rağmen)

yönetilmeyen kod kullanıyorsanız c) / windows API bunlar doğru sonra ele alınır bu. (Bazı kaynaklar serbest bırakmak için yöntemler temizlemek var)

Bu yardımcı olur umarım.

Cevap 01/08/2008 saat 18:57
kaynak kullanıcı

oy
15

Microsoft'tan CLR Profiler kullanarak http://www.microsoft.com/downloads/details.aspx?familyid=86ce6052-d7f4-4aeb-9b7a-94635beebdda&displaylang=en nesneler tutan bellek ne yürütme akış kabloları belirlemek için harika bir yoldur bu nesnelerin yaratılmasına ve ayrıca nerede yığın (parçalanma, LOH, vs.) canlı hangi nesnelerin izlenmesi.

Cevap 16/08/2008 saat 20:54
kaynak kullanıcı

oy
14

Çöp toplayıcı nasıl çalıştığını en iyi açıklamasının Jeff Richters bulunan C # yoluyla CLR kitabında, (Ch. 20). Bu okuma nesneler devam anlayış nasıl büyük bir topraklama verir.

yanlışlıkla nesneleri köklendirme en yaygın nedenlerinden biri bir sınıf Outisde olayları bağlamak gereğidir. Harici bir olay yatarsan

Örneğin

SomeExternalClass.Changed += new EventHandler(HandleIt);

ve daha sonra SomeExternalClass Sınıfınızda bir ref vardır, elden ne zaman kendisine unhook unutur.

Yukarıda belirtildiği gibi, SciTech bellek profilci size sızdırıyor zanlısı nesnelerin köklerini gösteren en mükemmel.

Ama (ekli yaparken bile VS.NET hemen penceresinde bu kullanabilirsiniz) WnDBG kullanmak belirli bir türünü kontrol etmek için çok hızlı bir yolu vardır:

.loadby sos mscorwks
!dumpheap -stat -type <TypeName>

Şimdi (örneğin bir pencereyi kapatmak) bu tür nesneleri imha düşünüyorum şey yapmak. Bu çalışacak bir ayıklama düğmesi bir yere sahip olmak burada kullanışlı System.GC.Collect()birkaç kez.

O zaman kaç !dumpheap -stat -type <TypeName>tekrar. Sayı gitmedi veya beklediğiniz kadar gitmedi, o zaman daha ayrıntılı inceleme için bir temel var. (I tarafından verilen bir seminerden bu ipucu var Ingo Rammer ).

Cevap 27/08/2008 saat 15:12
kaynak kullanıcı

oy
14

Ben yönetilen bir ortamda, bir sızıntı etrafında büyük bir hafızaya yığın gereksiz bir başvuru tutmak olacağını tahmin ediyorum.

Cevap 01/08/2008 saat 16:19
kaynak kullanıcı

oy
10

Neden insanlar NET'te bir bellek sızıntısı başka sızıntı aynı olmadığını düşünüyorsun?

Eğer bir kaynağa bağlamak ve gitmesine izin vermeyin bellek sızıntısı olduğunu. Yönetilen ve yönetilmeyen kodlama hem yapabilirsiniz.

.NET ile ilgili olarak, ve diğer programlama araçları, çöp toplama hakkında fikirler, ve uygulama sızıntısı yapacak durumları en aza indirmenin başka yolları da olmuştur. Ama hafıza sızıntılarını önleyen en iyi yöntem, temel bellek modeli anlamak gerektiğini ve işler nasıl çalıştığını, platform üzerinde kullandığınız.

GC ve diğer sihirli pisliğini temizler inanarak bellek sızıntılarını kısa yoldur ve daha sonra bulmak zor olacaktır.

yönetilmeyen kodlama yaparken, normalde size tutun kaynaklarımıza temizlemek için sorumluluk değil, kapıcı en olacağını biliyoruz, temizlemek için emin olun.

Öte yandan NET'te, bir sürü insan GC herşeyi temizlemek düşünüyorum. Eh, sizin için bazı yapar, ama o kadar olduğundan emin olmak gerekir. NET pek çok şey sarmak Bu nedenle, bunu bir yönetilen veya yönetilmeyen kaynakla ilgileniyor eğer hep bilmiyorum ve size uğraşıyoruz emin olmak gerekir. Taşıma yazı tipleri, GDI kaynakları, aktif dizin, veri tabanları vb genellikle için dışarı bakmak gerekir şeydir.

Yönetilen açısından ben süreci kaldırılır / öldürdü sonra uzak gidiyor söylemek hattında boynuma koyacağız.

Ben bir sürü insan olsa bu var bakın ve gerçekten bu sona erecek umuyoruz. Eğer pisliği temizlemek için uygulamanızı sonlandırmak için kullanıcı talep edemez! Bir tarayıcı bir göz atın, o IE, FF vb sonra açık, diyelim ki, Google Reader, bazı günlerce kalmasına izin ve ne olduğunu bakmak olabilir.

Eğer sonra bazı siteye tarayıcı, sörf başka bir sekme açın, tarayıcı kaçak yapılan diğer sayfasını barındırılan sekmeyi kapatmak, tarayıcı bellek yayınlayacak düşünüyorsunuz? Değil IE ile böylece. Benim bilgisayarda IE kolayca kısa bir miktarda süredir Google Reader kullanıyorsanız (yaklaşık 3-4 gün) bellek 1 GiB yiyeceklerdir. Bazı haber sayfası çok daha kötüdür.

Cevap 01/09/2008 saat 13:19
kaynak kullanıcı

oy
10

Ben yönetilen bir ortamda, bir sızıntı etrafında büyük bir hafızaya yığın gereksiz bir başvuru tutmak olacağını tahmin ediyorum.

Kesinlikle. Ayrıca, tek kullanımlık objeler üzerinde .Dispose () yöntemi kullanılarak değil, uygun hafız sızıntıya yol açabilir. otomatik sonunda .Dispose () çalıştırır, çünkü bunu yapmak için en kolay yolu bir şekilde blok ile:

StreamReader sr;
using(sr = new StreamReader("somefile.txt"))
{
    //do some stuff
}

Eğer yönetilmeyen nesneleri kullanan bir sınıf oluşturmak eğer doğru IDisposable uygulayan değilseniz Ve, sizin sınıfının kullanıcılar için bellek sızıntıları neden olabilir.

Cevap 05/08/2008 saat 23:47
kaynak kullanıcı

oy
9

Tüm bellek sızıntıları programı sonlandırma çözülür.

Yeterince bellek Sızıntı ve İşletim Sistemi sizin adınıza sorunu çözmek için karar verebilir.

Cevap 04/08/2008 saat 15:09
kaynak kullanıcı

oy
9

Bir Mem sızıntısı olacağını .net olarak Bernard ile hemfikir.

Bunu bellek kullanımını görmek için uygulama profil ve olmaması gerektiği halde onun çok fazla bellek yönetmek eğer bunu bir sızıntı var demek ki belirleyebilir.

Yönetilen açısından ben süreci kaldırılır / öldürdü sonra uzak gidiyor söylemek hattında boynuma koyacağız.

Yönetilmeyen kod kendi canavar ve kaçak içindeki varsa, standart bir mem izleyecektir. tanımını sızıntı.

Cevap 01/08/2008 saat 16:23
kaynak kullanıcı

oy
7

Ayrıca .NET iki yığınlar, bir büyük nesne yığın olmaktan vardır unutmayın. Kabaca 85k veya daha büyük nesneleri bu yığın konulur inanıyoruz. Bu yığın düzenli yığın farklı bir ömür boyu kuralları vardır.

Eğer büyük bellek yapılarını (Sözlük sitesinin veya Liste en) oluşturuyorsanız bu ihtiyatlı kesin kuralların ne arama gitmek istiyorum.

Bildiğim kadarıyla sizin Win98 çalışan veya eşdeğerleri sürece, süreç sona ermesi üzerine hafıza geri ödemelerine, her şey sona ermesi üzerine OS geri salınır. Tek istisna çapraz sürecini açılan şeylerdir ve başka işlem hala açık kaynak vardır.

COM nesneleri zor tho olabilir. Hep kullanırsanız IDisposedesen, güvende olacak. Ama uygulamak birkaç birlikte çalışma derlemeleri arasında koşuyoruz IDispose. Burada anahtar çağırmaktır Marshal.ReleaseCOMObjectonunla bitince. COM nesneleri hala standart COM referans sayma kullanın.

Cevap 07/08/2008 saat 14:17
kaynak kullanıcı

oy
6

Buldum NET bellek Profiler Net bellek sızıntılarını bulma zaman çok iyi bir yardım. Microsoft CLR Profiler gibi ücretsiz değil, ama bence noktaya daha hızlı ve daha fazlasıdır. bir

Cevap 20/08/2008 saat 19:39
kaynak kullanıcı

oy
1

Bir tanımı: bir uzun bir süreç tahsis yürütülürken yeni bir işlem ile ayrılabilecek ulaşılamaz bellek, serbest edilemiyor. Çoğunlukla, GC teknikleri kullanılarak tedavi veya otomatik araçlar tarafından tespit edilebilir.

Daha fazla bilgi için lütfen http://all-about-java-and-weblogic-server.blogspot.in/2014/01/what-is-memory-leak-in-java.html .

Cevap 27/08/2014 saat 16:22
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more