2015-03-10 21 views
6

Uygulamalarımdan birinin bellek sızıntısı olabilme olasılığını araştırdım, bu yüzden bazı temel kod örnekleri ile oynamaya başladım. Bitirdiğim zaman, zaman içinde bırakıldığında, Kol sayısı (> 3000) bakımından büyük ölçüde artmaya başladı. C# Kulp Sayısı

public static void Main(string[] args) 
{ 
    using (SqlConnection sqlConnection = new SqlConnection()) 
    { 
    } 

    Console.ReadLine(); 
} 

SqlConnection çağrıyı dışarı çıkarak herhangi Kol artışı kaldırır, bu yüzden bağlantı havuzu ile bir ilgisi vardır varsayıyorum şu şekildedir: O kodla çok basit bir konsol uygulamasıdır. Ama bu sadece temelde giriş için bir beklemeye girmeden önce bir kez çalıştığından, Tutanak sayısı neden artmaya devam ediyor?

Teşekkürler. Eğer nesne önbelleği çoğunluğu çerçevesinde oluştuğunu bulacaksınız

+1

Tutamaç sayısını nasıl kontrol edersiniz? – tia

+0

Görev Yöneticisi ve ayrıca İşlem Gezgini (sysinternals) kullanıyorum. –

+0

a Bellek, bir program kendi belleğini kendi kullanımları için saklar ve kapatıldığında serbest bırakmazsa veya kendi bellek kotasını aşarsa ve farklı bir işlem tarafından kullanılan bir bloğa yazarsa, işletim sistemi ikinci ve Çerçeve, ilk önce Mareşal kullanarak bellek el ile ayırma ve daha sonra temizlemek değil bellek sızıntıları sorunu olması muhtemeldir öneriyor – MikeT

cevap

4

yapıyor anlamına gelmez hatırlamak zorunda, bu durumda olabilir

https://connect.microsoft.com/VisualStudio/feedback/details/691725/sqlconnection-handle-leak-net-4-0

+0

Teşekkürler tia. Bu sorun gibi görünüyor. Projede 4.5.1'den 3.5'e kadar olan bir değişiklik yaptım, yeniden inşa oldum ve şimdi de Tutar sayısı sabit kalıyor. Yani Microsoft tarafından yayınlanan yukarıdaki tarafından gidiyor sadece bu iş parçacığı havuzundan toplamak için yavaştır ve bir uygulamada yeterli aktivite, gc içeri atmaya neden olduğunda tanıtıcı sayısı düşecektir. Hala tanıtmak için garip bir davranış görünüyor. Net 4.0 ... belki de performansla ya da bir şeyle ilgisi ... En azından, gördüğüm şeyi temizler. Şerefe. –

0

böyle dışarı elle dosyaları kendiniz

IIRC varsayılan nesne önbelleği ayrıştırmak zorunda olan yapılandırma dosyaları ve kaynaklara erişebilir böylece yaratılan gibi nesneleri yaklaşık 4000 nesnedir.

sadece senin sadece oluşturma ve tek bir nesne imha çünkü .NET 4.0 üzerinde çalıştırıyorsanız tüm çerçeve çalışması

+0

Yanıt için teşekkürler. Çerçevenin arka planda daha çok şey yaptığını anladım. Ancak bu SqlConnection oluşturma oluşturma çağrısı olmadan, uygulama tanıtıcı sayısı sabit kalır. Yani tam olarak bu tek bir çağrı başladıktan ya da başladığında neyin altına inmeye çalışır ki bu da bu Tutamak sayım davranışına yol açar. –

+0

SQL bağlantı sınıfına bir göz attığınızda SqlConnection, DbProviderFactory, IContainer gibi diğer sınıfları içerdiğini göreceksiniz. ISite, SecureString., ConnectionState, vb. Kullanımdan sonra bağlantı nesnesini elden çıkarmak için kullanma komutunu kullandığınız zaman, o zaman GC'nin bir sonraki çalıştırmasıyla alınacaktır, böylece sızıntı olmamalıdır. Siz GC'yi GC.Collect() – MikeT

+0

Merhaba MikeT ile çalışmaya zorlarsınız, yanıt için tekrar teşekkürler. Tia ile 3.5 ve üstü ile karşılaştırıldığında 3.5 of behavoiur fark işaret etmek için gittim. Ama evet, muhtemelen GC'yi zorlamak onu indirdi. Yine de, genellikle tavsiye edilmeyen bir şey olduğunu biliyorum. Sadece 3,5'e düşebilir. –