Leistungen
Leistungen
Überblick
Leistungsangebot
Kernkompetenzen
Schulungsthemen
In-House-Schulungen
Offene .NET-Seminare
Offene WPS-Seminare
Beratung
Coaching
Support
Softwareentwicklung
Entwickler-Vermittlung
.NET/Visual Studio
TFS/ALM/Scrum
Webprogrammierung
PowerShell
Konditionen
Anfrage/Kontakt
Beratung/Coaching
Beratung/Coaching
Beratungsthemen
Coaching
Unsere Berater
Referenzkunden
Konditionen
Angebotsanfrage
In-House-Schulungen
In-House-Schulungen
Überblick
Themen/Fachgebiete
Schulungskonfigurator
Konzepte
.NET/Visual Studio
C#
VB.NET
ASP.NET
Moderne Webanwendungen
TFS/ALM/Scrum
PowerShell
Konferenzvortraege
Referenzkunden
Unsere Trainer
Konditionen
Angebotsanfrage
Offene Schulungen
Offene Schulungen
Überblick .NET-Seminare
.NET/C#-Basisseminar
WPF (Desktop)
ASP.NET/AJAX (Web)
WCF/WF (SOA)
ADO.NET/EF (Data)
Windows PowerShell
.NET, C#, VB, Visual Studio
.NET, C#, VB, Visual Studio
Startseite
Beratung/Training
Offene .NET-Seminare
Einführung
Lexikon
Artikel
Bücher
Klassenreferenz
Programmiersprachen
Entwicklerwerkzeuge
Softwarekomponenten
World Wide Wings Demo
Codebeispiele
Scripting
ASP.NET
.NET 2.0
.NET 3.0/3.5
.NET 4.0/4.5
Community
Forum
Kommerzielle Leistungen
ASP.NET
ASP.NET
Startseite
Lexikon
Sicherheit
Konfiguration
Global.asax
Tracing
Technische Beiträge
Klassenreferenz
Programmiersprachen
Entwicklerwerkzeuge
Softwarekomponenten
PowerShell
PowerShell
Überblick
Beratung
In-House-Schulungen
Öffentliche Schulungen
Codebeispiele
Commandlet Extensions
Offene PowerShell-Seminare
Inhouse-Seminare
Windows
Windows
Startseite
Windows Runtime (WinRT)
Windows PowerShell
Windows Scripting
Windows-Schulungen
Windows-Lexikon
Windows-Forum
Windows Scripting
Windows Scripting
Startseite
Lexikon
FAQ
Buecher
Architektur
Skriptsprachen
Scripting-Hosts
Scripting-Komponenten
COM/DCOM/COM+
ADSI
WMI
Scripting-Tools
WSH-Editoren
Codebeispiele
ASP.NET
.NET-Scripting
Forum
Links
Kommerzielle Leistungen
Service
Service
Website-FAQ
Anmeldung/Login
Leser-Registrierung
Gast-Registrierung
Nachrichten/RSS
Newsletter
Foren
Weblog
Lexikon
Downloads
Support
Kontakt
Literaturtipps
Publikationen
Publikationen
Redaktionsbüro
Bücher
Fachartikel
Leser-Portal
Autoren gesucht!
Rezensionen
Über uns
Über uns
Holger Schwichtenberg
Team
Referenzkunden
Kundenaussagen
Referenzprojekte
Partner
Site Map
Weitere Websites
Tag Cloud
Impressum
Rechtliches

GarbageCollector.vb
Codebeispiel für Visual Basic .NET (VB.NET) und CSharp (C#)

Liste aller Codebeispiele

GarbageCollector.vb

Ein Beispiel zum Einsatz der Klasse System.GC aus der .NET-Klassenbibliothek.

Autor: Dr. Holger Schwichtenberg 

Beschreibung

Zunächst werden sechs Instanzen der Klasse Instanzenzaehler erzeugt und in einem Array gespeichert. Dann werden nacheinander einzelne Objekte vernichtet. Bei Objekt #6 wird direkt nach der Objektvernichtung der GC aufgerufen. Dass der GC arbeitet, wird durch die Ausgaben des Destruktors bewiesen. Der freie Speicher wird dann direkt dreimal nacheinander ausgegeben, um zu demonstrieren, dass die Freigabe des Speichers im Hintergrund abläuft und kurze Zeit dauern kann.

Anschließend wird Objekt #3 vernichtet, ohne Aufruf des GCs. Das Ausbleiben der Ausgaben des Destruktors und die konstante Speicherallokation beweisen, dass der Destruktor noch gar nicht aufgerufen wurde.

Objekt #2 wird dann ebenfalls ohne Aufruf von GC.Collect() vernichtet. Jedoch bewirkt der Parameter true bei GetTotalMemory(True), dass der GC gestartet wird. In diesem Moment wird nicht nur der Destruktor von Objekt #2, sondern auch von dem zuvor vernichteten Objekt #3 aufgerufen.

Vor der Vernichtung von Objekt #1 wird dann SuppressFinalize() für dieses Objekt gestartet. Nach dem anschließenden Collect() stellt man zwar eine Speicherabnahme fest, jedoch bleibt der Aufruf des Destruktors für Objekt #1 aus.

Durch den Client wird die nachfolgend wiedergegebene Ausgabe erzeugt. Man sieht bei der Instanziierung (Zeilen 6, 9, 12, 15, 18 und 21), dass jeweils zwölf Bytes für eine Instanz verbraucht werden. Nach dem Aufruf von GC.Collect() werden aber – nach kurzer Verzögerung – mehr als zwölf Bytes freigegeben (Zeile 27), weil der Garbage Collector auch mit internen Objekten aufräumt. Dass nach der Vernichtung der Objekte #2 und #3 in Zeile 38 der Speicherbedarf wieder ansteigt, ist ebenfalls auf interne Vorgänge zurückzuführen. Nach der Vernichtung von Objekt #1 sieht man aber deutlich den Rückgang von zwölf Bytes (Zeile 40 im Vergleich zu Zeile 38). Nach dem Ende der Unterroutine werden erst die Destruktoren für die Objekte #4 und #5 aufgerufen, die von dem Programm in Ruhe gelassen wurden.
Dass das Programm am Ende (Zeile 45) des Destruktors von Objekt #4 meint, dass es nun immer noch eine Instanz gäbe, ist erklärbar: Durch die Unterdrückung des Aufrufs des Destruktors von Objekt #1 wurde das Klassenmitglied Anzahl_Instanzen der Klasse Instanzenzaehler bei der Vernichtung von Objekt #1 nicht erniedrigt.

Programmcodebeispiele Visual Basic .NET (VB.NET)

' --- Manueller Aufruf des .NET Garbage Collectors
   Sub garbagecollector_test()

   Dim i As Integer
   Dim o(10) As Object

   'Dim x As Object = Application
   outtitle("Manuelle Bedienung des GC")

   out("### Objekte erzeugen...")
   For i = 1 To 6
   ' --- Objekt erzeugen
   o(i) = New Instanzenzaehler()
   ' --- freien Speicher ausgeben
   out("Speicher: " & GC.GetTotalMemory(True))
   Next

   out("### Objekte schrittweise vernichten...")

   ' ---- 1. Objekt vernichten
   out("Objekt 6 vernichten...")
   o(6) = Nothing
   ' --- GC starten
   GC.Collect()
   ' --- freien Speicher ausgeben
   out("Speicher: " & GC.GetTotalMemory(False))
   out("Speicher: " & GC.GetTotalMemory(False))
   out("Speicher: " & GC.GetTotalMemory(False))

   ' ---- 2. Objekt vernichten
   out("Objekt 3 vernichten...")
   o(3) = Nothing
   ' --- freien Speicher ausgeben
   out("Speicher: " & GC.GetTotalMemory(False))
   out("Speicher: " & GC.GetTotalMemory(False))
   out("Speicher: " & GC.GetTotalMemory(False))

   ' ---- 3. Objekt vernichten
   out("Objekt 2 vernichten...")
   o(2) = Nothing
   ' --- GC + freien Speicher ausgeben
   out("Speicher: " & GC.GetTotalMemory(True))

   ' ---- 4. Objekt vernichten
   out("Objekt 1 vernichten...")
   ' --- Finalize() unterdrücken
   GC.SuppressFinalize(o(1))
   o(1) = Nothing
   ' --- GC starten
   GC.Collect()
   out("Speicher: " & GC.GetTotalMemory(True))

   ' --- Endausgabe
   out("### ENDE DES GC-TEST")
   End Sub

Programmcodebeispiele CSharp (C#)

using System;
using System.Collections;

namespace FCL_Buch._System {

  public class Samples_GarbageCollector {

   public void GC_Test() {

   object[] testObject = new object[6];

   FclOutput.PrintOutSubHeader( "/* " );
   FclOutput.PrintOutSubHeader( " * Manuelle Bedienung des Garbage Collectors");
   FclOutput.PrintOutSubHeader( " */" );

   // Objekte erzeugen und freien Speicher ausgeben
   FclOutput.PrintOut( "Objekte erzeugen...\r\n" );

   for ( int i=0; i<6; i++ ) {
   testObject[i] = new InstanceCounter();
   FclOutput.PrintOut("Objekt " + i.ToString() + " erzeugt, Speicher: " + GC.GetTotalMemory( true ) );
   }

   FclOutput.PrintOutSubHeader("Objekte schrittweise vernichten...\r\n");

   // 1. Objekt vernichten
   FclOutput.PrintOut( "Objekt 6 vernichten..." );
   testObject[5] = null;
   // GC starten
   GC.Collect();
   // freien Speicher ausgeben
   FclOutput.PrintOut("Speicher: " + GC.GetTotalMemory( false ) );
  
   // 2. Objekt vernichten
   FclOutput.PrintOut("Objekt 3 vernichten...");
   testObject[2] = null;
   // freien Speicher ausgeben
   FclOutput.PrintOut("Speicher: " + GC.GetTotalMemory( false ) );

   // 3. Objekt vernichten
   FclOutput.PrintOut("Objekt 2 vernichten...");
   testObject[1] = null;
   // GC + freien Speicher ausgeben
   FclOutput.PrintOut("Speicher: " + GC.GetTotalMemory( true ));

   // 4. Objekt vernichten
   FclOutput.PrintOut("Objekt 1 vernichten ... Finalisierer unterdrückt" );
   // Finalize() unterdrücken
   GC.SuppressFinalize( testObject[0] );
   testObject[0] = null;
   // GC starten
   GC.Collect();
   FclOutput.PrintOut("Speicher: " + GC.GetTotalMemory( true ) );

   // Endausgabe
   FclOutput.PrintOutSubHeader("\r\n Ende des GC-Tests");
   }
  }
}

Querverweise

Definition '.NET Framework Class Library'
Verfügbarkeit der Klasse 'System'
Übersicht über den FCL-Namensraum 'System'
Portal dotnetframework.de