2016-04-02 32 views
0

Yazılımın belleğinin tükenmesini dotMemory JetBrains aracılığıyla izliyorum.Varlık Çerçevesi Bellek Sızıntısı

Depomda bir sorgu yaptığımda, pencereyi kapatırsam, aramayı yaptığım nesneyi bıraktığımı fark ettim; Depomu hafızamda kullandım ve hatta içeriğimi bertaraf ettim ama hafızada hiçbir şey kalmadı. Neleri kontrol edebilirim? İşte

kusurlu kodudur:

if (creazioneDocumento == null || creazioneDocumento.Count == 0) return; 

nesne hatırladı ama en kısa sürede değildir: hata ayıklama yapmak

LoginViewModel.cs

using (DbContext = new Context()) 
{ 
    var creazioneDocumentoRepository = new RepositoryBase<CreazioneDocumento>(ctx); 
    var creazioneDocumento = creazioneDocumentoRepository.Lista(); 

    if (creazioneDocumento == null || creazioneDocumento.Count == 0) 
     return; 

    var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita); 
    _NumeroDecimaliQuantita = decimaliQuantita != 0 && decimaliQuantita > 0 ? decimaliQuantita : 0; 

    var decimaliPrezzo = creazioneDocumento.Max(x => x.NumeroDecimaliPrezzo); 
    _NumeroDecimaliPrezzo = decimaliPrezzo != 0 && decimaliPrezzo > 0 ? decimaliPrezzo : 3; 
    _NumeroDecimaliImponibile = 2; 

    // ctx.Dispose(); 
} 

, ben kadar fark Nesneyi bellekte kaldığı "max" ı çalıştırıyorum. Referans ve bellekte benim loginviewmodel tutmak metodlar

enter image description here

yerine bu ekran görüntüsü söylüyor ve onlar iki max olduğuna inanıyoruz: Burada

dotmemory gelen bir ekran görüntüsü

enter image description here

+0

Sen çöp toplamayla ortamında bir bellek sızıntısı kanıtlanmış DEĞİL olduğunu biliyoruz? Tek yaptığınız, toplanan çöp toplanmamış nesnelerin, bellekten YET olmadıklarıdır. İkinci ölçümü almadan önce GC'nin çalışmasının kanıtını kaçırırsınız. Kapatmak için oylama - yeniden yüklenemez. – TomTom

+0

@TomTom dotMemory anlık görüntü aldığında, tam bir çöp toplama işlemi yapar, dolayısıyla bellekte nesneler varsa bazı kökler tarafından tutulduğu anlamına gelir. Brux88: LoginViewModel'in kendisinin bir örneğini görmüyorum, ancak bazı lambdaların kapanmasıyla birlikte başka bazı delegeler tarafından bellekte tutuluyor. LoginViewModel sınıfı kaynak koduyla daha fazlasını söylemek imkansız. –

+0

Aslında, düşündüğüm gibi. ama hafızayı nasıl kaldıracağımı anlamıyorum. Bu satırı çalıştırdığımda sorun: var decimaliQuantita = creazioneDocumento.Max (x => x.NumeroDecimaliQuantita); ..... nasıl tamir edebilirim? – Brux88

cevap

0

.NET CLR, yönetilen, çöp toplama bir çalışma zamanı/sanal makinesidir.

Bu nesnelerin, gerekli olmadıklarında hemen geri alınmasını ve bellekten kaldırılmasını bekleyemezsiniz.

Diğer taraftan, IDisposable.Dispose, uygulama tarafından kullanılan temel kaynakları serbest bırakmak için kod tanımlamak için kullanılan bir arabirim yöntemidir: belleği serbest bırakmak için yerleşik bir yöntem değildir.

Çöp toplayıcı (GC) belleği bir arka plan işlemi olarak kabul eder ve anında bir şey kaldırmaz, ancak fazla mesai varsayımlarına dayanmaz.

fazla okuma: Understanding garbage collection in .NET

+0

Ayrıca, IDisposable.Dispose ile yönetilmeyen kaynakların serbest bırakıldığından emin olmalısınız. AMA, sizin durumunuzda, birleştirilmiş bir DBMS ile bağlantınız vardır, böylece bağlantı ve ilgili kaynaklar serbest bırakılmayacaktır. Bir stres testi çalıştırırsanız ve hafızayı profillerseniz yönetilen nesneler için muhtemelen bir testere dişi şekli görürsünüz. – bubi

+0

bellek toplayıcı bir bellek anlık görüntüsü elde etmek için tam çöp toplama gerçekleştirir –