Zum Identifizieren von Speicher Speicherverluste in der common Language runtime

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 318263 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt welcher Speicher Speicherverluste werden und listet mögliche Ursachen von Speicherverlusten. Darüber hinaus erläutert in diesem Artikel die wahrgenommene Speicherverlust und wie es als true Speicherverlust fehlinterpretiert werden kann.

Weitere Informationen

Speicherverluste können eine Anwendung Ressourcen ausgeführt und können eine Anwendung zum Absturz verursachen. Es ist wichtig, Speicherverluste zu ermitteln. Das Problem von Speicherlecks hat in C und C++-Entwickler jahrelang plagued. In Microsoft Visual Studio 2005 oder in Microsoft Visual Studio .NET eine umfassende Garbage Auflistung Paket und verwalteten Speicher können Speicherverluste beenden, jedoch unter bestimmten Umständen kann ein Programm zu Speicherverlust werden angezeigt.

Definition der Speicherverlust

Tritt auf ein Speicherverlust, wenn Speicher in einem Programm zugeordnet wird und wird nie an das Betriebssystem zurückgegeben, obwohl das Programm den Speicher nicht mehr verwenden. Die vier grundlegenden Typen von Speicherverlusten sind:
  • In einer Umgebung manuell verwalteten Speicher: Arbeitsspeicher dynamisch reserviert und auf die von einem Zeiger verwiesen wird. Der Zeiger wird gelöscht, bevor der Speicher freigegeben wird. Nach der Zeiger gelöscht wird, wird der Speicher kann nicht mehr zugegriffen werden und kann nicht freigegeben werden.
  • In einer Umgebung dynamisch verwalteten Speicher: Speicher freigegeben jedoch nie gesammelt werden, weil ein Verweis auf das Objekt weiterhin aktiv ist. Da ein Verweis auf das Objekt noch aktiv ist, sammelt der Garbage Collector nie, dass der Speicher. Dies kann mit einem Verweis auftreten, die vom System oder das Programm festgelegt ist.
  • In einer Umgebung dynamisch verwalteten Speicher: der Garbage Collector sammeln können und gibt frei Speicher jedoch nie es zurück an das Betriebssystem. Dies tritt, wenn der Garbage Collector die Objekte, die noch werden verwenden, um einen Teil des Speichers und die übrigen frei verschieben können.
  • In jeder Umgebung Speicher: schlecht Memory Management führen kann, wenn viele große Objekte deklariert und nicht zulässig, Gültigkeitsbereich verlassen. Speicher ist demzufolge verwendet und nicht freigegeben.

Diskussion

Wegen des Garbage Auflistung-Pakets, die in Microsoft .NET Framework implementiert wird, ist es nicht möglich, einen Speicherverlust in verwaltetem Code. Dies schlägt zwei Fragen: wie dann kann ein Speicherverlust auftreten? Warum wird es angezeigt, dass Sie einen Speicherverlust haben?

Ein Speicherverlust kann in einer .NET Framework-Anwendung auftreten, wenn Sie nicht verwalteten Code als Teil der Anwendung verwenden. Diese nicht verwaltete Code kann Speicherverluste, Speicher und .NET Framework Common Language Runtime kann nicht das Problem beheben.

Darüber hinaus werden ein Projekt nur angezeigt, um einen Speicherverlust. Diese Bedingung kann auftreten, wenn viele große Objekte (z.B. DataTable -Objekte) deklariert und anschließend eine Auflistung (z. B. ein DataSet ) hinzugefügt werden. Die Ressourcen, die diese Objekte besitzen möglicherweise nie freigegeben, und die Ressourcen bleiben aktiv für die gesamte von der Anwendung ausgeführt werden. Dies scheint ein Leck sein, aber tatsächlich ist es lediglich ein Symptom für die Möglichkeit, die Speicher in der Anwendung zugewiesen ist.

Angenommen, Sie verfügen über ein DataSet . Jedes Mal, das eine neue Abfrage ausgeführt wird, fügen Sie ein neues DataTable -Element hinzu, dass DataSet für die Daten, die zurückgegeben wird. Wenn große Datenmengen, die Sie nie verkaufen vorhanden sind, bleibt die Daten aktiv, solange das DataSet noch in Gebrauch ist. In diesem Fall genügend Zeiten ist es möglich, nicht genügend Arbeitsspeicher verfügbar. Dies ist keinen Speicherverlust, aber stattdessen ist es ein Problem bei der Verwaltung des Speichers. Finden Sie im folgenden Codebeispiel:
  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
				
Hinweis dieses Beispiel ist nur ein Ausschnitt des Codes. In diesem Beispiel wird davon ausgegangen, dass Microsoft SQL Server auf dem lokalen Computer installiert ist und, dass der Benutzer, der dieser Code ausgeführt wird, Zugriff auf die Nordwind -Datenbank hat, die in SQL Server enthalten ist.

Obwohl dieser Code natürlich ineffizient und nicht praktikabel ist, ist es dafür vorgesehen, führen Sie vor, wenn Objekte einer Auflistung (z. B. die Tabellen der DataSet -Auflistung hinzufügen) hinzugefügt werden, die Objekte aktiv bleiben, solange die Auflistung aktiv bleibt. Wenn eine Auflistung auf globaler Ebene des Programms deklariert ist und Objekte sind in der gesamten Anwendung deklariert und hinzugefügt-Auflistung, dies bedeutet, obwohl die Objekte nicht mehr im Gültigkeitsbereich vorhanden sind, die Objekte aktiv bleiben, da Sie weiterhin verwiesen wird.

Jedes Mal, die in diesem Fall des Arbeitsspeichers, dass die Anwendung erhöht verwendet wird. Der Speicher wird bis Ende des Programms oder die Version der Objekte aus der Auflistung nicht verringert. Wenn Sie das Programm auf ein Systemmonitor beobachten, Dies scheint einen Speicherverlust zu sein, aber es ist nicht. Die Anwendung weiterhin hat Kontrolle über den Arbeitsspeicher, sondern hat entschieden, diese Version nicht. Die Tatsache, dass das Programm weiterhin Steuerelement hat verhindert dies einen Speicherverlust, aber die Tatsache, dass das Programm verwendete Speichermenge erhöhen hält kann machen es die scheinbar einen Speicherverlust.

Symptome von Speicherverlust

Wenn die Speichermenge, die ein Programm während der Ausführung zu erhöhen weiterhin, ist dies ein Symptom für ein Speicherverlust. (Sie können diese Anzahl Arbeitsspeicher über eine Systemmonitor ansehen.) Dazu führen, des Arbeitsspeichers, den die Anwendung verwendet, kann die Ausführung aus der Ressourcen und zum Absturz des Programms dass.

Informationsquellen

Der folgende Code ist eine Liste der Hilfethemen Weitere Informationen zum Arbeitsspeicher und seine Verwaltung:
  • GC-Klasse
  • Speicherleistungsindikatoren
  • Automatische Speicherverwaltung
  • Interoperabilität mit nicht verwaltetem Code
Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
317297Wegweiser für das Debuggen hängt, Speicherverlusten, Deadlocks und Racebedingungen in Visual Basic .NET
Informationen finden Sie auf den folgenden Websites von Microsoft Developer Network (MSDN):
http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

http://msdn.microsoft.com/en-us/library/fz5w87ad.aspx

http://msdn.microsoft.com/en-us/library/kxx6e7z6.aspx

http://msdn.microsoft.com/en-us/library/s3aw423e.aspx

Eigenschaften

Artikel-ID: 318263 - Geändert am: Mittwoch, 6. Dezember 2006 - Version: 4.7
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Common Language Runtime (included with the .NET Framework) 1.0
  • Microsoft Common Language Runtime (included with the .NET Framework 1.1)
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Academic Edition
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual J# .NET 2003 Standard Edition
Keywords: 
kbmt kbvs2005swept kbvs2005applies kbinfo KB318263 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 318263
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com