Bu makalede, hangi bir bellek sızıntısı olduğu anlatılır ve Bellek sızıntılarını bazı olası nedenleri listeler. Ayrıca, algılanan bir bellek sızıntısı ve nasıl, doğru bellek sızıntısı gibi misinterpreted bu makalede anlatılmaktadır.
Bellek sızıntıları uygulama kaynakları yetersiz çalışmasına neden olabilir ve bir uygulamanın kilitlenmesine neden olabilir. Bellek sızıntılarını belirlemek önemlidir. Bellek sızıntısı sorununu C ve C++ geliştiricileri, yıllara ait plagued. Microsoft Visual Studio 2005 veya Microsoft Visual Studio. NET'te bir kapsamlı bir atık toplama paketi ve yönetilen belleği, bellek sızıntıları durdurabilirsiniz, ancak bazı durumlarda, bellek sızıntı için bir program olarak görünebilir.
Bellek sızıntısı tanımı
Bellek bir programda ayrılır ve işletim sistemi tarafından döndürülen hiçbir zaman rağmen program bellek artık kullanmayan BIR bellek sızıntısı oluşur. Bellek sızıntıları dört temel türleri şunlardır:
- Bir <a0>el ile yönetilen bellek</a0> ortamında: bellek dinamik olarak ayrılan ve bir işaretçi başvuruyor. Işaretçiyi, bellek serbest önce silinir. Işaretçiyi silindikten sonra bellek artık erişilebilir ve bu nedenle serbest bırakılamıyor.
- Bir <a0>dinamik olarak yönetilen bellek</a0> ortamında: bellek aktiften ancak nesnesine bir başvuru hala etkin olduğundan hiçbir zaman, toplanan. Çöp toplayıcısını, hiçbir zaman nesnesine bir başvuru hala etkin olduğundan, bu bellek toplar. Bu, sistem veya program tarafından ayarlanmış bir başvurusu olan oluşabilir.
- Bir <a0>dinamik olarak yönetilen bellek</a0> ortamında: çöp toplayıcısını toplayabilir ve boş bellek ancak hiçbir, işletim sistemine verir. Bu durum yine de bulunan nesneler için belleğin bir bölümünü kullanma ve kalan boş çöp toplayıcısını taşıyamıyor oluşur.
- Tüm <a0>bellek</a0> ortamında: düşük bellek yönetimi, birçok büyük nesne bildirilen ve kapsam bırakmak için hiçbir zaman izin neden olabilir. Sonuç olarak, bellek kullanılan ve hiçbir zaman serbest.
Tartışma
Microsoft .NET Framework'de uygulanan çöp toplama paketi nedeniyle, yönetilen kod bir bellek sızıntısı mümkün değildir. Bu iki soruyu önerir: nasıl sonra bellek sızıntısı oluşabilir? Neden bir bellek sızıntısı var görünmüyor?
Uygulamanın bir parçası yönetilmeyen kod kullandığınızda bellek sızıntısı bir .NET Framework uygulamasında oluşabilir. Bu yönetilmeyen kod, .NET Framework ve bellek sızdırıyor çalıştırma modülünün bu sorunla edemiyor.
Ayrıca, proje, yalnızca bir bellek sızıntısı için görüntülenebilir. (Örneğin, DataTable
nesneleri) çok büyük nesneler bildirilen ve koleksiyonu (örneğin, bir DataSet
) eklenen bu durum oluşabilir. Bu nesnelerin sahibi kaynakları hiçbir zaman yayımlanacak ve tüm program çalışan için kaynakları Canlı kalır. Bu bir sızıntısı gibi görünüyor, ancak gerçekte yalnızca bir belirtisi, bellek programa ayrılmış şekilde olacaktır.
Örneğin, bir DataSet
var. Yeni bir sorgu çalıştırdığınızda, her zaman döndürülen veriyi tutmak için bu DataSet
için yeni bir DataTable
öğesi ekleyin. Büyük tutarları, hiçbir zaman atma veri varsa, DataSet'in
hala kullanımda olarak verilerin canlı olarak kalır. Yeterli bir kez oluşursa, yetersiz bellek olasıdır. Bu bellek sızıntısı değildir, ancak bunun yerine, bellek yönetimi, bir sorundur. Aşağıdaki kod örneği Bkz:
Not
Dim DS As DataSet Dim cn As New SqlClient.SqlConnection("data source=localhost;initial catalog=Northwind;integrated security=SSPI") cn.Open() Dim da As New SqlClient.SqlDataAdapter("Select * from Employees", cn) Dim i As Integer DS = New DataSet() For i = 0 To 1000 da.Fill(DS, "Table" + i.ToString) Next
bu örnekte, yalnızca bir kod parçacığı olan. Bu örnek Microsoft SQL Server'ın yerel bilgisayarda yüklü olduğunu ve bu kodu kullanan kullanıcı SQL Server'ın içerdiği Northwind
veritabanına erişimi olduğunu varsayar.
Bu kod açıktır verimsiz ve değil kullanışlı olsa da, nesneleri koleksiyonu (örneğin, tablolar, DataSet
derlemesine ekleyerek) eklenirse, koleksiyon Canlı kaldığı sürece nesneleri etkin tutulur olduğunu göstermek için tasarlanmıştır. Bunlar hala başvurulan için bir program Genel düzeyde bildirilir ve nesneler tüm programa bildirilir ve nesneler artık kapsamda olsa tahsilat, yani, eklenen, nesneleri canlı olarak kalır.
Bu oluşur, her zaman program artar kullandığı bellek miktarı. Bellek sonuna kadar program veya nesnelerin sürümünden koleksiyon kadar azaltamaz. Bir performans izleyicisi programı izlemek için bu bellek sızıntısı gibi görünüyor, ancak bu. Program hala bellek üzerinde denetimi yoktur ancak onu serbest seçti. Program denetim hala olduğu gerçeğini bu bellek sızıntısı engeller, ancak program kullanılan bellek miktarını artırmayı tutar gerçeğini bellek sızıntısı gibi görünmesini sağlayabilirsiniz.
Bellek sızıntısı belirtileri
Yürütme sırasında artırmak bir program kullanmak bellek miktarını devam eder, bu bellek sızıntısı belirtisi olur. (Bu sayı bir performans izleyicisi ile bellek izleyebilir.) Programın kullandığı bellek miktarı zaman içinde kaynakları yetersiz ve kilitlenme çalıştırılacak programın neden olabilir.