Jump to content

RAM leeren, wenn man Variableninhalt löscht


Direkt zur Lösung Gelöst von mwiederkehr,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Guten Tag.

Zeile:

$Auflistung = Get-Childitem -Literalpath 'c:\windows\servicing' -Recurse -Force -ErrorAction:SilentlyContinue

RAM wird dadurch von 35 auf 1400 MB gefüllt.

Keiner von Varianten leert die RAM:

1.

$Auflistung = $Null

2.

for ($i = 0; $i -le ($Auflistung.length -1); $i++)
{
$Auflistung[$i] = $null
}

Kann man RAM leeren ohne, daß man die Sitzung schließt?
 

Link zu diesem Kommentar
  • Beste Lösung

Da das Aufräumen durch den Garbage Collector Ressourcen benötigt, macht er es nur, wenn nötig. Es bringt nichts, alle paar Millisekunden aufzuräumen, wenn vielleicht ein paar Sekunden später der ganze Prozess entsorgt werden kann. Ein Kriterium für das Starten des Aufräumvorgangs ist Speicherknappheit. Wahrscheinlich hast Du in Deinem Rechner genügend RAM, sodass es auf das Gigabyte mehr oder weniger nicht ankommt. Selbst wenn man den Garbage Collector mit "[System.GC]::Collect()" manuell startet, räumt er ohne Zwang nicht auf. Das scheint aber spezifisch für die PowerShell zu sein, bei .NET macht er es sonst schon. Zwingen kann man ihn mit "[System.GC]::GetTotalMemory(‘forcefullcollection’) | out-null". (Vorher muss natürlich die Variable mit "Clear-Variable" geleert werden.) Quelle: https://www.jhouseconsulting.com/2017/09/25/addressing-the-powershell-garbage-collection-bug-1825

 

Aber das sollte nicht notwendig sein. Ich betreibe .NET-Dienste, die wochenlang laufen und täglich grosse Datenmengen verarbeiten. Wenn man die Objekte sauber leert, macht der GC seine Arbeit zuverlässig und man hat keine Memory Leaks zu befürchten.

Link zu diesem Kommentar

Danke. "System.GC" bietet hier das, was ich suche. Ich werde mich dann weiter einlesen.

Habe einfach gemerkt, daß wenn ich eine Variable, wie ggf $Auflistung, leere und sie neu belege, steigt RAM-Belegung weiter. Wann es automatisch freigegeben wird, will ich nicht warten - Verbrauch kann groß sein. Und wenn die automatische Bereinigung mitten in der Bearbeitung, kurz bevor es auf SSD geschrieben wird, passiert, dann mache ich es lieber früher, wenn es so wie so wegen interaktive Pause nichts läuft.
Nebenbei habe ich beim experimentieren mit der Klasse gemerkt, daß wenn ich mehrere unterschiedlich genannte Auflistungen mache und eine, welche ich irgendwo am Anfang gemacht habe, lösche, dann wird RAM nur freigegeben, wenn man [System.GC]::Collect(2,1,$true,$true) macht. Scheint die konsequenteste Methode zu sein.
 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...